Ich verwende das offizielle Postgres Docker-Image und versuche, die Konfiguration anzupassen. Zu diesem Zweck verwende ich den Befehl sed
, max_connections
um beispielsweise Folgendes zu ändern :
sed -i -e"s/^max_connections = 100.*$/max_connections = 1000/" /var/lib/postgresql/data/postgresql.conf
Ich habe zwei Methoden ausprobiert, um diese Konfiguration anzuwenden. Zum einen fügen Sie die Befehle einem Skript hinzu und kopieren sie in den Init-Ordner "/docker-entrypoint-initdb.d". Die zweite Methode besteht darin, sie direkt in meiner Docker-Datei mit dem Befehl "RUN" auszuführen (diese Methode funktionierte gut mit einem nicht offiziellen Postgresql-Image mit einem anderen Pfad zur Konfigurationsdatei "/ etc / postgres / ..."). In beiden Fällen schlagen die Änderungen fehl, weil die Konfigurationsdatei fehlt (ich denke, sie wurde noch nicht erstellt).
Wie soll ich die Konfiguration ändern?
Bearbeiten 1:
Hier ist die Docker-Datei, mit der das Bild erstellt wurde:
# Database (http://www.cs3c.ma/)
FROM postgres:9.4
MAINTAINER Sabbane <contact@cs3c.ma>
ENV TERM=xterm
RUN apt-get update
RUN apt-get install -y nano
ADD scripts /scripts
# ADD scripts/setup-my-schema.sh /docker-entrypoint-initdb.d/
# Allow connections from anywhere.
RUN sed -i -e"s/^#listen_addresses =.*$/listen_addresses = '*'/" /var/lib/postgresql/data/postgresql.conf
RUN echo "host all all 0.0.0.0/0 md5" >> /var/lib/postgresql/data/pg_hba.conf
# Configure logs
RUN sed -i -e"s/^#logging_collector = off.*$/logging_collector = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_directory = 'pg_log'.*$/log_directory = '\/var\/log\/postgresql'/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_filename = 'postgresql-\%Y-\%m-\%d_\%H\%M\%S.log'.*$/log_filename = 'postgresql_\%a.log'/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_file_mode = 0600.*$/log_file_mode = 0644/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_truncate_on_rotation = off.*$/log_truncate_on_rotation = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_rotation_age = 1d.*$/log_rotation_age = 1d/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_min_duration_statement = -1.*$/log_min_duration_statement = 0/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_checkpoints = off.*$/log_checkpoints = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_connections = off.*$/log_connections = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_disconnections = off.*$/log_disconnections = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^log_line_prefix = '\%t \[\%p-\%l\] \%q\%u@\%d '.*$/log_line_prefix = '\%t \[\%p\]: \[\%l-1\] user=\%u,db=\%d'/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_lock_waits = off.*$/log_lock_waits = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_temp_files = -1.*$/log_temp_files = 0/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#statement_timeout = 0.*$/statement_timeout = 1800000 # in milliseconds, 0 is disabled (current 30min)/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^lc_messages = 'en_US.UTF-8'.*$/lc_messages = 'C'/" /var/lib/postgresql/data/postgresql.conf
# Performance Tuning
RUN sed -i -e"s/^max_connections = 100.*$/max_connections = 1000/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^shared_buffers =.*$/shared_buffers = 16GB/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#effective_cache_size = 128MB.*$/effective_cache_size = 48GB/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#work_mem = 1MB.*$/work_mem = 16MB/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#maintenance_work_mem = 16MB.*$/maintenance_work_mem = 2GB/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#checkpoint_segments = .*$/checkpoint_segments = 32/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#checkpoint_completion_target = 0.5.*$/checkpoint_completion_target = 0.7/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#wal_buffers =.*$/wal_buffers = 16MB/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#default_statistics_target = 100.*$/default_statistics_target = 100/" /var/lib/postgresql/data/postgresql.conf
VOLUME ["/var/lib/postgresql/data", "/var/log/postgresql"]
CMD ["postgres"]
Mit dieser Docker-Datei zeigt der Erstellungsprozess den Fehler: sed: can't read /var/lib/postgresql/data/postgresql.conf: No such file or directory
quelle
docker exec -it container_id bash
dann Ihre Änderungen vorzunehmen.docker commit container_id myuser/myimage_myPostegresql:myversion
paintedfox/postgresql
ist es möglich, die Konfiguration direkt in der Docker-Datei zu ändern. Ich denke, das sollte auch mit dem offiziellen Bild möglich sein.Antworten:
Das
postgres:9.4
Bild, von dem Sie geerbt haben, deklariert ein Volume bei/var/lib/postgresql/data
. Dies bedeutet im Wesentlichen, dass Sie keine Dateien in diesen Pfad in Ihrem Bild kopieren können. Die Änderungen werden verworfen.Sie haben einige Möglichkeiten:
Sie können einfach Ihre eigenen Konfigurationsdateien als Volume zur Laufzeit mit hinzufügen
docker run -v postgresql.conf:/var/lib/postgresql/data/postgresql.conf ...
. Ich bin mir jedoch nicht sicher, wie genau dies mit dem vorhandenen Volume interagieren wird.Sie können die Datei kopieren, wenn der Container gestartet wird. Kopieren Sie dazu Ihre Datei in den Build an einem Ort, der sich nicht unter dem Volume befindet, und rufen Sie dann vom Einstiegspunkt oder cmd aus ein Skript auf, das die Datei an den richtigen Ort kopiert und postgres startet.
Klonen Sie das Projekt hinter dem offiziellen Postgres-Image und bearbeiten Sie die Docker-Datei, um Ihre eigene Konfigurationsdatei hinzuzufügen, bevor VOLUME deklariert wird (alles, was hinzugefügt wird, bevor die VOLUME-Anweisung zur Laufzeit automatisch kopiert wird).
Übergeben Sie alle Konfigurationsänderungen in der Befehlsoption in der Docker-Compose-Datei
mögen:
quelle
Mit Docker Compose
Wenn Sie mit Docker Compose arbeiten, können
command: postgres -c option=value
Siedocker-compose.yml
Postgres in Ihrem konfigurieren.Dadurch wird Postgres beispielsweise in einer Datei protokolliert:
Wenn Sie die Antwort von Vojtech Vitek anpassen , können Sie verwenden
Zum Ändern der Konfigurationsdatei wird Postgres verwendet. Sie würden Ihre benutzerdefinierte Konfigurationsdatei mit einem Volume bereitstellen:
Hier ist die
docker-compose.yml
meiner Anwendung, die zeigt, wie Postgres konfiguriert wird:Berechtigung zum Schreiben in das Protokollverzeichnis
Beachten Sie, dass unter Linux das Protokollverzeichnis auf dem Host über die richtigen Berechtigungen verfügen muss. Andernfalls wird der leicht irreführende Fehler angezeigt
Ich sage irreführend, da die Fehlermeldung darauf hinweist, dass das Verzeichnis im Container die falsche Berechtigung hat, obwohl das Verzeichnis auf dem Host in Wirklichkeit kein Schreiben zulässt.
Um dies zu beheben, habe ich mit die richtigen Berechtigungen für den Host festgelegt
quelle
docker-compose.yml
.Injizieren Sie die benutzerdefinierte postgresql.conf in den postgres Docker-Container
Die Standarddatei befindet sich
postgresql.conf
inPGDATA
dir (/var/lib/postgresql/data
), was die Sache insbesondere beim erstmaligen Ausführen des Postgres-Containers komplizierter macht, da derdocker-entrypoint.sh
Wrapper deninitdb
Schritt zurPGDATA
Dir-Initialisierung aufruft .Um die PostgreSQL-Konfiguration in Docker konsistent anzupassen, empfehle ich die Verwendung der
config_file
Option postgres zusammen mit Docker-Volumes wie folgt:Produktionsdatenbank (PGDATA-Verzeichnis als beständiges Volume)
Datenbank testen (PGDATA-Verzeichnis wird danach verworfen
docker rm
)Debuggen
-d
(Option trennen) ausdocker run
, um die Serverprotokolle direkt anzuzeigen.Stellen Sie mit dem psql-Client eine Verbindung zum Postgres-Server her und fragen Sie die Konfiguration ab:
quelle
Wenn Sie den offiziellen Einstiegspunkt laufen (AKA , wenn Sie die Container starten), läuft es
initdb
in$PGDATA
(/var/lib/postgresql/data
Standardeinstellung), und speichert es dann in diesem Verzeichnis dieser 2 - Dateien:postgresql.conf
mit manuellen Standardeinstellungen.postgresql.auto.conf
mit Einstellungen, die automatisch mitALTER SYSTEM
Befehlen überschrieben werden.Der Einstiegspunkt führt auch alle
/docker-entrypoint-initdb.d/*.{sh,sql}
Dateien aus.All dies bedeutet, dass Sie in diesem Ordner ein Shell- / SQL-Skript bereitstellen können, das den Server für den nächsten Start konfiguriert (unmittelbar nach der DB-Initialisierung oder beim nächsten Start des Containers).
Beispiel:
conf.sql
Datei:Dockerfile
Datei:Und dann müssen Sie
conf.sql
manuell in bereits vorhandenen Datenbanken ausführen . Da die Konfiguration auf dem Volume gespeichert ist, überlebt sie Neuerstellungen.Eine andere Alternative besteht darin, die
-c
Flagge so oft zu übergeben, wie Sie möchten:Auf diese Weise müssen Sie kein neues Image erstellen und sich nicht um bereits vorhandene oder nicht vorhandene Datenbanken kümmern. alles wird betroffen sein.
quelle
Sie können Ihre benutzerdefinierte
postgresql.conf
Datei in eine temporäre Datei im Container einfügen und die Standardkonfiguration zur Laufzeit überschreiben.Das zu tun :
postgresql.conf
in Ihren ContainerupdateConfig.sh
Datei in/docker-entrypoint-initdb.d/
Dockerfile
updateConfig.sh
Zur Laufzeit führt der Container das Skript im Inneren aus
/docker-entrypoint-initdb.d/
und überschreibt die Standardkonfiguration mit Ihrer benutzerdefinierten.quelle
/docker-entrypoint-initdb.d/updateConfig.sh
?Ich habe alle Antworten durchgesehen und es gibt noch eine andere Option. Sie können Ihren CMD-Wert in der Docker-Datei ändern (dies ist nicht der beste, aber dennoch mögliche Weg, um Ihr Ziel zu erreichen).
Grundsätzlich müssen wir
Beispiel für eine Docker-Datei:
Obwohl ich denke, dass die Verwendung
command: postgres -c config_file=/etc/postgresql/postgresql.conf
in Ihrerdocker-compose.yml
von Matthias Braun vorgeschlagenen Datei die beste Option ist.quelle
Eine relativ einfache Lösung für dieses Problem scheint darin zu bestehen, den Dienst (ich verwende Swarm für AWS und eine Yaml-Datei) mit Ihren Datenbankdateien zu deklarieren, die auf einem dauerhaften Volume bereitgestellt sind (hier AWS EFS, wie vom Cloudstor: aws-Treiber angegeben) Spezifikation).
Ein angenehmer Nebeneffekt beim Beibehalten Ihrer Konfiguration ist, dass auch Ihre Datenbanken beibehalten werden (oder war es umgekehrt) ;-)
quelle
Meine Lösung richtet sich an Kollegen, die Änderungen an der Konfiguration vornehmen müssen, bevor sie docker-entrypoint-initdb.d starten
Ich musste die Einstellung 'shared_preload_libraries' ändern, damit postgres während der Arbeit bereits eine neue Bibliothek vorinstalliert hat und der Code in docker-entrypoint-initdb.d sie verwenden kann.
Also habe ich gerade die Datei postgresql.conf.sample in Dockerfile gepatcht:
Und mit diesem Patch wird es möglich, eine Erweiterung in der SQL-Datei in docker-entrypoint-initdb.d /: hinzuzufügen.
quelle
Das funktioniert bei mir:
quelle
Mit Docker Compose können Sie ein Volume mit mounten
postgresql.auto.conf
. Beispiel:quelle
postgresql.auto.conf
da es überschrieben wird. Verwenden Sie diepostgresql.conf
am selben Ort.Ich habe auch das offizielle image (
FROM postgres
) verwendet und konnte die Konfiguration durch Ausführen der folgenden Befehle ändern.Als erstes müssen Sie die PostgreSQL-Konfigurationsdatei suchen. Dies kann durch Ausführen dieses Befehls in Ihrer laufenden Datenbank erfolgen.
Ich mein Fall es kehrt zurück
/data/postgres/postgresql.conf
.Der nächste Schritt besteht darin, herauszufinden, was der Hash Ihres laufenden PostgreSQL-Docker-Containers ist.
Dies sollte eine Liste aller laufenden Container zurückgeben. In meinem Fall sieht es so aus.
Jetzt müssen Sie zur Bash in Ihrem Container wechseln, indem Sie Folgendes ausführen:
Überprüfen Sie im Container, ob sich die Konfiguration im richtigen Pfad befindet, und zeigen Sie sie an.
Ich wollte die maximale Anzahl von Verbindungen von 100 auf 1000 und den gemeinsam genutzten Puffer von 128 MB auf 3 GB ändern. Mit dem Befehl sed kann ich in der Konfiguration suchen und durch die entsprechenden Variablen ersetzen.
Als letztes müssen wir die Datenbank im Container neu starten. Finden Sie heraus, welche Version von PostGres Sie verwenden.
In meinem Fall ist es
12
so, dass Sie die Datenbank jetzt neu starten können, indem Sie den folgenden Befehl mit der richtigen Version ausführen.quelle