Estoy usando la imagen oficial de Postgres Docker tratando de personalizar su configuración. Para este propósito, uso el comando sed
para cambiar, max_connections
por ejemplo:
sed -i -e"s/^max_connections = 100.*$/max_connections = 1000/" /var/lib/postgresql/data/postgresql.conf
Probé dos métodos para aplicar esta configuración. La primera es agregar los comandos a un script y copiarlo dentro de la carpeta de inicio "/docker-entrypoint-initdb.d". El segundo método es ejecutarlos directamente dentro de mi Dockerfile con el comando "RUN" (este método funcionó bien con una imagen de Postgresql no oficial con una ruta diferente al archivo de configuración "/ etc / postgres / ..."). En ambos casos, los cambios fallan porque falta el archivo de configuración (creo que aún no se ha creado).
¿Cómo debo cambiar la configuración?
Edición 1:
Aquí está el Dockerfile usado para crear la imagen:
# 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"]
Con este Dockerfile, el proceso de compilación muestra el error: sed: can't read /var/lib/postgresql/data/postgresql.conf: No such file or directory
fuente
docker exec -it container_id bash
luego hacer sus modificaciones, luegodocker commit container_id myuser/myimage_myPostegresql:myversion
ver el documento docs.docker.com/reference/commandline/cli/#commitpaintedfox/postgresql
es posible cambiar la configuración directamente dentro del Dockerfile. Creo que eso también debería ser posible con la imagen oficial.Respuestas:
La
postgres:9.4
imagen que ha heredado declara un volumen en/var/lib/postgresql/data
. Básicamente, esto significa que no puede copiar ningún archivo a esa ruta en su imagen; los cambios se descartarán.Tienes algunas opciones:
Puede agregar sus propios archivos de configuración como un volumen en tiempo de ejecución con
docker run -v postgresql.conf:/var/lib/postgresql/data/postgresql.conf ...
. Sin embargo, no estoy seguro de cómo interactuará exactamente con el volumen existente.Puede copiar el archivo cuando se inicia el contenedor. Para hacer eso, copie su archivo en la compilación en una ubicación que no esté debajo del volumen, luego llame a un script desde el punto de entrada o cmd que copiará el archivo a la ubicación correcta e iniciará postgres.
Clone el proyecto detrás de la imagen oficial de Postgres y edite el Dockerfile para agregar su propio archivo de configuración antes de que se declare VOLUME (cualquier cosa agregada antes de que la instrucción VOLUME se copia automáticamente en el tiempo de ejecución).
Pase todos los cambios de configuración en la opción de comando en el archivo docker-compose
me gusta:
fuente
Con Docker Compose
Cuando se trabaja con estibador de composición, se puede utilizar
command: postgres -c option=value
en sudocker-compose.yml
configurar Postgres.Por ejemplo, esto hace que Postgres se registre en un archivo:
Adaptando la respuesta de Vojtech Vitek , puede usar
para cambiar el archivo de configuración que utilizará Postgres. Montarías tu archivo de configuración personalizado con un volumen:
Aquí está el
docker-compose.yml
de mi aplicación, que muestra cómo configurar Postgres:Permiso para escribir en el directorio de registro
Tenga en cuenta que cuando está en Linux, el directorio de registro del host debe tener los permisos adecuados. De lo contrario, obtendrá el error ligeramente engañoso
Digo engañoso, ya que el mensaje de error sugiere que el directorio en el contenedor tiene el permiso incorrecto, cuando en realidad el directorio en el host no permite escribir.
Para solucionar esto, configuré los permisos correctos en el host usando
fuente
docker-compose.yml
.Inyecte postgresql.conf personalizado en el contenedor Docker de postgres
El
postgresql.conf
archivo predeterminado vive dentro dePGDATA
dir (/var/lib/postgresql/data
), lo que complica las cosas, especialmente cuando se ejecuta el contenedor postgres por primera vez, ya que eldocker-entrypoint.sh
contenedor invoca elinitdb
paso para laPGDATA
inicialización de dir.Para personalizar la configuración de PostgreSQL en Docker de manera consistente, sugiero usar la
config_file
opción de postgres junto con volúmenes de Docker como este:Base de datos de producción (directorio PGDATA como volumen persistente)
Prueba de base de datos (el directorio PGDATA se descartará después
docker rm
)Depuración
-d
(opción de desconexión) deldocker run
comando para ver los registros del servidor directamente.Conéctese al servidor de postgres con el cliente psql y consulte la configuración:
fuente
Cuando se ejecuta el punto de entrada oficial (También conocido como cuando se lanza el contenedor), que se ejecuta
initdb
en$PGDATA
(/var/lib/postgresql/data
por defecto), y luego se almacena en el directorio que estos 2 archivos:postgresql.conf
con la configuración manual predeterminada.postgresql.auto.conf
con configuraciones anuladas automáticamente conALTER SYSTEM
comandos.El punto de entrada también ejecuta cualquier
/docker-entrypoint-initdb.d/*.{sh,sql}
archivo.Todo esto significa que puede proporcionar un script shell / SQL en esa carpeta que configura el servidor para el próximo inicio (que será inmediatamente después de la inicialización de la base de datos, o las próximas veces que inicie el contenedor).
Ejemplo:
conf.sql
expediente:Dockerfile
expediente:Y luego tendrá que ejecutar
conf.sql
manualmente en bases de datos ya existentes. Dado que la configuración se almacena en el volumen, sobrevivirá a las reconstrucciones.Otra alternativa es pasar la
-c
bandera tantas veces como desee:De esta manera, no necesita crear una nueva imagen y no necesita preocuparse por las bases de datos ya existentes o no; todos se verán afectados.
fuente
Puede poner su personalizado
postgresql.conf
en un archivo temporal dentro del contenedor y sobrescribir la configuración predeterminada en tiempo de ejecución.Para hacer eso :
postgresql.conf
dentro de su contenedorupdateConfig.sh
archivo en/docker-entrypoint-initdb.d/
Dockerfile
updateConfig.sh
En tiempo de ejecución, el contenedor ejecutará el script dentro
/docker-entrypoint-initdb.d/
y sobrescribirá la configuración predeterminada con la personalizada.fuente
/docker-entrypoint-initdb.d/updateConfig.sh
:?Revisé todas las respuestas y me queda otra opción. Puede cambiar su valor de CMD en el archivo de la ventana acoplable (no es la mejor, pero aún es una forma posible de lograr su objetivo).
Básicamente necesitamos
Ejemplo de archivo Docker:
Aunque creo que usarlo
command: postgres -c config_file=/etc/postgresql/postgresql.conf
en sudocker-compose.yml
archivo propuesto por Matthias Braun es la mejor opción.fuente
Una solución de baja tecnología para este problema parece ser declarar el servicio (estoy usando swarm en AWS y un archivo yaml) con los archivos de su base de datos montados en un volumen persistente (aquí AWS EFS como lo indica el controlador cloudstor: aws especificación).
Un efecto secundario agradable de conservar su configuración es que también conserva sus bases de datos (o fue al revés) ;-)
fuente
Mi solución es para colegas que necesitan realizar cambios en la configuración antes de iniciar docker-entrypoint-initdb.d
Se me necesitaba para cambiar la configuración de 'shared_preload_libraries', por lo que durante su trabajo, Postgres ya tiene una nueva biblioteca precargada y el código en docker-entrypoint-initdb.d puede usarlo.
Así que acabo de parchear el archivo postgresql.conf.sample en Dockerfile:
Y con este parche es posible agregar una extensión en el archivo .sql en docker-entrypoint-initdb.d /:
fuente
Esto funciona para mi:
fuente
Utilizando docker compose puede montar un volumen con
postgresql.auto.conf
. Ejemplo:fuente
postgresql.auto.conf
ya que se sobrescribe. Utilice elpostgresql.conf
en el mismo lugar.También estaba usando la imagen oficial (
FROM postgres
) y pude cambiar la configuración ejecutando los siguientes comandos.Lo primero es ubicar el archivo de configuración de PostgreSQL. Esto se puede hacer ejecutando este comando en su base de datos en ejecución.
Yo mi caso vuelve
/data/postgres/postgresql.conf
.El siguiente paso es averiguar cuál es el hash de su contenedor Docker PostgreSQL en ejecución.
Esto debería devolver una lista de todos los contenedores en ejecución. En mi caso se ve así.
Ahora tienes que cambiar al bash dentro de tu contenedor ejecutando:
Dentro del contenedor, verifique si la configuración está en la ruta correcta y muéstrela.
Quería cambiar las conexiones máximas de 100 a 1000 y el búfer compartido de 128 MB a 3 GB. Con el comando sed puedo hacer una búsqueda y reemplazar con las variables correspondientes en la configuración.
Lo último que tenemos que hacer es reiniciar la base de datos dentro del contenedor. Descubra qué versión de PostGres está utilizando.
En mi caso, es
12
así que ahora puede reiniciar la base de datos ejecutando el siguiente comando con la versión correcta en su lugar.fuente