Я использую официальный образ Docker Postgres, пытаясь настроить его конфигурацию. Для этого я использую команду sed
для изменения, max_connections
например:
sed -i -e"s/^max_connections = 100.*$/max_connections = 1000/" /var/lib/postgresql/data/postgresql.conf
Я попробовал два метода применить эту конфигурацию. Первый - добавить команды в сценарий и скопировать его в папку инициализации «/docker-entrypoint-initdb.d». Второй метод - запускать их прямо в моем Dockerfile с помощью команды «RUN» (этот метод отлично работал с неофициальным образом Postgresql с другим путем к файлу конфигурации «/ etc / postgres / ...»). В обоих случаях изменения не удаются, потому что файл конфигурации отсутствует (я думаю, что он еще не создан).
Как мне изменить конфигурацию?
Изменить 1:
Вот файл Dockerfile, используемый для создания образа:
# 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"]
С этим Dockerfile процесс сборки показывает ошибку: sed: can't read /var/lib/postgresql/data/postgresql.conf: No such file or directory
источник
docker exec -it container_id bash
внести изменения, затемdocker commit container_id myuser/myimage_myPostegresql:myversion
просмотреть doc docs.docker.com/reference/commandline/cli/#commitpaintedfox/postgresql
, можно изменить конфигурацию непосредственно в файле Dockerfile. Я думаю, что это должно быть возможно и с официальным изображением.Ответы:
postgres:9.4
Изображение , которое вы унаследовали от декларирует объем в/var/lib/postgresql/data
. По сути, это означает, что вы не можете копировать файлы по этому пути в вашем изображении; изменения будут отменены.У вас есть несколько вариантов:
Вы можете просто добавить свои собственные файлы конфигурации в виде тома во время выполнения с
docker run -v postgresql.conf:/var/lib/postgresql/data/postgresql.conf ...
. Однако я не уверен, как именно это будет взаимодействовать с существующим томом.Вы можете скопировать файл при запуске контейнера. Для этого скопируйте файл в сборку в место, которое не находится под томом, затем вызовите скрипт из точки входа или cmd, который скопирует файл в правильное место и запустит postgres.
Клонируйте проект за официальным образом Postgres и отредактируйте Dockerfile, чтобы добавить свой собственный файл конфигурации до объявления VOLUME (все, что добавлено до инструкции VOLUME, автоматически копируется во время выполнения).
Передайте все изменения конфигурации в параметре команды в файле docker-compose
лайк:
источник
С Docker Compose
При работе с Докер Compose, вы можете использовать
command: postgres -c option=value
в вашемdocker-compose.yml
настроить Postgres.Например, это делает журнал Postgres в файл:
Адаптировав ответ Войтех Витек , вы можете использовать
чтобы изменить файл конфигурации, который будет использовать Postgres. Вы бы смонтировали свой собственный файл конфигурации с томом:
Вот
docker-compose.yml
мое приложение, показывающее, как настроить Postgres:Разрешение на запись в каталог журналов
Обратите внимание, что в Linux каталог журнала на хосте должен иметь необходимые разрешения. В противном случае вы получите слегка вводящую в заблуждение ошибку
Я говорю, что вводит в заблуждение, поскольку сообщение об ошибке предполагает, что каталог в контейнере имеет неправильное разрешение, тогда как в действительности каталог на хосте не разрешает запись.
Чтобы исправить это, я установил правильные разрешения на хосте, используя
источник
docker-compose.yml
.Внедрить пользовательский postgresql.conf в контейнер Postgres Docker
postgresql.conf
Файл по умолчанию находится вPGDATA
dir (/var/lib/postgresql/data
), что усложняет задачу, особенно при первом запуске контейнера postgres, посколькуdocker-entrypoint.sh
оболочка вызываетinitdb
этапPGDATA
инициализации dir.Чтобы последовательно настраивать конфигурацию PostgreSQL в Docker, я предлагаю использовать
config_file
опцию postgres вместе с такими томами Docker:Производственная база данных (каталог PGDATA как постоянный том)
База данных тестирования (после этого каталог PGDATA будет удален
docker rm
)Отладка
-d
(параметр отсоединения) изdocker run
команды, чтобы напрямую просматривать журналы сервера.Подключитесь к серверу postgres с клиентом psql и запросите конфигурацию:
источник
При запуске официального EntryPoint (AKA при запуске контейнера), она работает
initdb
в$PGDATA
(/var/lib/postgresql/data
по умолчанию), а затем он сохраняет в этой директории эти 2 файла:postgresql.conf
с ручными настройками по умолчанию.postgresql.auto.conf
с настройками, автоматически заменяемымиALTER SYSTEM
командами.Точка входа также выполняет любые
/docker-entrypoint-initdb.d/*.{sh,sql}
файлы.Все это означает, что вы можете предоставить сценарий оболочки / SQL в этой папке, который настраивает сервер для следующей загрузки (которая будет сразу после инициализации БД или при следующей загрузке контейнера).
Пример:
conf.sql
файл:Dockerfile
файл:И тогда вам придется выполнять
conf.sql
вручную в уже существующих базах данных. Поскольку конфигурация хранится в томе, она сохранится после перестроения.Другой вариант - передать
-c
флаг столько раз, сколько хотите:Таким образом, вам не нужно создавать новый образ, и вам не нужно заботиться об уже существующих или несуществующих базах данных; все будет затронуто.
источник
Вы можете поместить свой заказ
postgresql.conf
во временный файл внутри контейнера и перезаписать конфигурацию по умолчанию во время выполнения.Для этого:
postgresql.conf
в свой контейнерupdateConfig.sh
файл в/docker-entrypoint-initdb.d/
Dockerfile
updateConfig.sh
Во время выполнения контейнер выполнит сценарий внутри
/docker-entrypoint-initdb.d/
и перезапишет конфигурацию по умолчанию вашей собственной.источник
/docker-entrypoint-initdb.d/updateConfig.sh
?Я просмотрел все ответы, остался еще один вариант. Вы можете изменить значение CMD в файле докеров (это не лучший, но все же возможный способ достижения вашей цели).
В основном нам нужно
Пример файла Docker:
Хотя я думаю, что использование
command: postgres -c config_file=/etc/postgresql/postgresql.conf
в вашемdocker-compose.yml
файле, предложенное Матиасом Брауном, - лучший вариант.источник
Довольно низкотехнологичное решение этой проблемы, по-видимому, состоит в объявлении службы (я использую swarm на AWS и файл yaml) с файлами вашей базы данных, подключенными к постоянному тому (здесь AWS EFS, как обозначено драйвером cloudstor: aws Технические характеристики).
Приятным побочным эффектом сохранения вашей конфигурации является то, что она также сохраняет ваши базы данных (или было наоборот) ;-)
источник
Мое решение для коллег, которым необходимо внести изменения в конфигурацию перед запуском docker-entrypoint-initdb.d
Мне нужно было изменить настройку shared_preload_libraries, чтобы во время работы у postgres уже была предварительно загружена новая библиотека, и код в docker-entrypoint-initdb.d мог ее использовать.
Итак, я просто пропатчил файл postgresql.conf.sample в Dockerfile:
И с этим патчем стало возможно добавить расширение в файл .sql в docker-entrypoint-initdb.d /:
источник
Это работает для меня:
источник
Используя docker compose, вы можете смонтировать том с помощью
postgresql.auto.conf
. Пример:источник
postgresql.auto.conf
поскольку он перезаписан. Используйтеpostgresql.conf
в том же месте.Я также использовал официальный образ (
FROM postgres
), и мне удалось изменить конфигурацию, выполнив следующие команды.Во-первых, найдите файл конфигурации PostgreSQL. Это можно сделать, выполнив эту команду в вашей работающей базе данных.
В моем случае он возвращается
/data/postgres/postgresql.conf
.Следующим шагом является определение хеш-кода вашего запущенного контейнера докеров PostgreSQL.
Это должно вернуть список всех работающих контейнеров. В моем случае это выглядит так.
Теперь вам нужно переключиться на bash внутри вашего контейнера, выполнив:
Внутри контейнера проверьте правильность пути конфигурации и отобразите ее.
Я хотел изменить максимальное количество подключений со 100 до 1000, а общий буфер со 128 МБ до 3 ГБ. С помощью команды sed я могу выполнить поиск и заменить соответствующие переменные в конфигурации.
Последнее, что нам нужно сделать, это перезапустить базу данных в контейнере. Узнайте, какую версию PostGres вы используете.
В моем случае это
12
Итак, теперь вы можете перезапустить базу данных, выполнив следующую команду с правильной версией.источник