Używam oficjalnego obrazu Postgres Docker, próbując dostosować jego konfigurację. W tym celu używam polecenia sed
do zmiany max_connections
np .:
sed -i -e"s/^max_connections = 100.*$/max_connections = 1000/" /var/lib/postgresql/data/postgresql.conf
Wypróbowałem dwie metody, aby zastosować tę konfigurację. Pierwsza polega na dodaniu poleceń do skryptu i skopiowaniu go w folderze init „/docker-entrypoint-initdb.d”. Druga metoda polega na uruchomieniu ich bezpośrednio w moim pliku Dockerfile za pomocą polecenia „RUN” (ta metoda działała dobrze z nieoficjalnym obrazem Postgresql z inną ścieżką do pliku konfiguracyjnego „/ etc / postgres / ...”). W obu przypadkach zmiany kończą się niepowodzeniem, ponieważ brakuje pliku konfiguracyjnego (myślę, że nie został jeszcze utworzony).
Jak zmienić konfigurację?
Edycja 1:
Oto plik Dockerfile użyty do utworzenia obrazu:
# 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"]
W tym pliku Dockerfile proces kompilacji pokazuje błąd: sed: can't read /var/lib/postgresql/data/postgresql.conf: No such file or directory
źródło
docker exec -it container_id bash
a następnie wprowadzenie zmian, a następniedocker commit container_id myuser/myimage_myPostegresql:myversion
zobacz docs.docker.com/reference/commandline/cli/#commitpaintedfox/postgresql
możliwa jest zmiana konfiguracji bezpośrednio w pliku Dockerfile. Myślę, że powinno to być również możliwe z oficjalnym wizerunkiem.Odpowiedzi:
postgres:9.4
Obraz masz odziedziczone deklaruje głośność na/var/lib/postgresql/data
. Zasadniczo oznacza to, że nie możesz kopiować żadnych plików do tej ścieżki w obrazie; zmiany zostaną odrzucone.Masz kilka możliwości:
Możesz po prostu dodać własne pliki konfiguracyjne jako wolumin w czasie wykonywania z
docker run -v postgresql.conf:/var/lib/postgresql/data/postgresql.conf ...
. Nie jestem jednak pewien, jak to wpłynie na istniejący wolumen.Możesz skopiować plik po uruchomieniu kontenera. Aby to zrobić, skopiuj plik do kompilacji w lokalizacji, która nie znajduje się pod woluminem, a następnie wywołaj skrypt z punktu wejścia lub cmd, który skopiuje plik do właściwej lokalizacji i uruchomi postgres.
Sklonuj projekt za oficjalnym obrazem Postgres i edytuj plik Dockerfile, aby dodać własny plik konfiguracyjny przed zadeklarowaniem VOLUME (wszystko, co zostało dodane przed instrukcją VOLUME, jest automatycznie kopiowane w czasie wykonywania).
Przekaż wszystkie zmiany konfiguracji w opcji polecenia w pliku docker-compose
lubić:
źródło
Z Docker Compose
Podczas pracy z Docker Compose możesz użyć
command: postgres -c option=value
w swoim,docker-compose.yml
aby skonfigurować Postgres.Na przykład, to sprawia, że Postgres loguje się do pliku:
Dostosowując odpowiedź Vojtech Vitek , możesz użyć
aby zmienić plik konfiguracyjny, którego będzie używał Postgres. Zamontowałbyś swój niestandardowy plik konfiguracyjny z woluminem:
Oto
docker-compose.yml
moja aplikacja, pokazująca, jak skonfigurować Postgres:Uprawnienie do zapisu w katalogu dziennika
Należy pamiętać, że w systemie Linux katalog dziennika na hoście musi mieć odpowiednie uprawnienia. W przeciwnym razie pojawi się nieco mylący błąd
Mówię mylące, ponieważ komunikat o błędzie sugeruje, że katalog w kontenerze ma niewłaściwe uprawnienia, podczas gdy w rzeczywistości katalog na hoście nie pozwala na zapis.
Aby to naprawić, ustawiłem odpowiednie uprawnienia na hoście za pomocą
źródło
docker-compose.yml
.Wstrzyknij niestandardowy plik postgresql.conf do kontenera postgres Docker
Domyślny
postgresql.conf
plik znajduje się wPGDATA
dir (/var/lib/postgresql/data
), co komplikuje sprawę, szczególnie przy pierwszym uruchomieniu kontenera postgres, ponieważdocker-entrypoint.sh
opakowanie wywołujeinitdb
krokPGDATA
inicjalizacji katalogu .Aby konsekwentnie dostosować konfigurację PostgreSQL w Dockerze, sugeruję użycie
config_file
opcji postgres razem z woluminami Dockera w następujący sposób:Produkcyjna baza danych (katalog PGDATA jako trwały wolumen)
Testowanie bazy danych (katalog PGDATA zostanie usunięty po
docker rm
)Debugowanie
-d
opcję (odłącz opcję) zdocker run
polecenia, aby bezpośrednio wyświetlić dzienniki serwera.Połącz się z serwerem postgres za pomocą klienta psql i zapytaj o konfigurację:
źródło
Po uruchomieniu oficjalnego punktu wejścia (AKA po uruchomieniu pojemnik), uruchamia
initdb
się$PGDATA
(/var/lib/postgresql/data
domyślnie), a następnie przechowuje w tym katalogu te 2 pliki:postgresql.conf
z domyślnymi ustawieniami ręcznymi.postgresql.auto.conf
z ustawieniami zastępowanymi automatycznie za pomocąALTER SYSTEM
poleceń.Punkt wejścia wykonuje również dowolne
/docker-entrypoint-initdb.d/*.{sh,sql}
pliki.Wszystko to oznacza, że możesz dostarczyć skrypt powłoki / SQL w tym folderze, który konfiguruje serwer do następnego rozruchu (który nastąpi natychmiast po inicjalizacji bazy danych lub następnym uruchomieniu kontenera).
Przykład:
conf.sql
plik:Dockerfile
plik:A następnie będziesz musiał wykonać
conf.sql
ręcznie w już istniejących bazach danych. Ponieważ konfiguracja jest przechowywana w woluminie, przetrwa ona przebudowę.Inną alternatywą jest przekazywanie
-c
flagi tyle razy, ile chcesz:W ten sposób nie musisz budować nowego obrazu i nie musisz martwić się o już istniejące lub nie bazy danych; wszystko będzie miało wpływ.
źródło
Możesz umieścić swój niestandardowy
postgresql.conf
plik w pliku tymczasowym wewnątrz kontenera i nadpisać domyślną konfigurację w czasie wykonywania.Aby to zrobić :
postgresql.conf
wewnątrz konteneraupdateConfig.sh
plik w formacie/docker-entrypoint-initdb.d/
Dockerfile
updateConfig.sh
W czasie wykonywania kontener wykona skrypt wewnątrz
/docker-entrypoint-initdb.d/
i nadpisze domyślną konfigurację konfiguracją niestandardową.źródło
/docker-entrypoint-initdb.d/updateConfig.sh
?Przejrzałem wszystkie odpowiedzi i została inna opcja. Możesz zmienić swoją wartość CMD w pliku docker (nie jest to najlepsza, ale wciąż możliwa droga do osiągnięcia celu).
Zasadniczo musimy
Przykład pliku Docker:
Chociaż myślę, że użycie
command: postgres -c config_file=/etc/postgresql/postgresql.conf
w twoimdocker-compose.yml
pliku zaproponowanego przez Matthiasa Brauna jest najlepszą opcją.źródło
Wydaje się, że dość mało technicznym rozwiązaniem tego problemu jest zadeklarowanie usługi (używam roju na AWS i pliku yaml) z plikami bazy danych zamontowanymi na trwałym woluminie (tutaj AWS EFS, co jest oznaczone przez sterownik cloudstor: aws specyfikacja).
Przyjemnym efektem ubocznym utrzymywania konfiguracji jest to, że utrzymuje się ona również w twoich bazach danych (lub było odwrotnie) ;-)
źródło
Moje rozwiązanie jest dla kolegów, którzy muszą wprowadzić zmiany w konfiguracji przed uruchomieniem docker-entrypoint-initdb.d
Musiałem zmienić ustawienie `` shared_preload_libraries '', więc podczas pracy postgres ma już wstępnie załadowaną nową bibliotekę i kod w docker-entrypoint-initdb.d może z niej korzystać.
Więc właśnie załatałem plik postgresql.conf.sample w Dockerfile:
Dzięki tej poprawce stało się możliwe dodanie rozszerzenia w pliku .sql w docker-entrypoint-initdb.d /:
źródło
To działa dla mnie:
źródło
Używając docker compose, możesz zamontować wolumin za pomocą
postgresql.auto.conf
. Przykład:źródło
postgresql.auto.conf
ponieważ został nadpisany. Użyjpostgresql.conf
w tej samej lokalizacji.Używałem również oficjalnego image (
FROM postgres
) i mogłem zmienić konfigurację, wykonując następujące polecenia.Pierwszą rzeczą jest zlokalizowanie pliku konfiguracyjnego PostgreSQL. Można to zrobić, wykonując to polecenie w uruchomionej bazie danych.
W moim przypadku wraca
/data/postgres/postgresql.conf
.Następnym krokiem jest ustalenie, jaki jest skrót twojego działającego kontenera dockera PostgreSQL.
Powinno to zwrócić listę wszystkich uruchomionych kontenerów. W moim przypadku wygląda to tak.
Teraz musisz przejść do bash w swoim kontenerze, wykonując:
Wewnątrz kontenera sprawdź, czy konfiguracja znajduje się we właściwej ścieżce i wyświetl ją.
Chciałem zmienić maksymalne połączenia ze 100 na 1000 i współdzielony bufor ze 128 MB na 3 GB. Za pomocą polecenia sed mogę przeprowadzić wyszukiwanie i zastąpić odpowiednimi zmiennymi w pliku config.
Ostatnią rzeczą, jaką musimy zrobić, jest ponowne uruchomienie bazy danych w kontenerze. Dowiedz się, której wersji PostGres używasz.
W moim przypadku
12
możesz więc teraz zrestartować bazę danych, wykonując następujące polecenie z poprawną wersją.źródło