Saltar al contenido

¿Cómo personalizar el archivo de configuración de la imagen oficial de PostgreSQL Docker?

Solución:

Con Docker Compose

Cuando trabaja con Docker Compose, puede usar command: postgres -c option=value en tus docker-compose.yml para configurar Postgres.

Por ejemplo, esto hace que Postgres registre en un archivo:

command: postgres -c logging_collector=on -c log_destination=stderr -c log_directory=/logs

Adaptando la respuesta de Vojtech Vitek, puede usar

command: postgres -c config_file=/etc/postgresql.conf

para cambiar el archivo de configuración que utilizará Postgres. Montarías tu archivo de configuración personalizado con un volumen:

volumes:
   - ./customPostgresql.conf:/etc/postgresql.conf

Aquí esta la docker-compose.yml de mi aplicación, mostrando cómo configurar Postgres:

# Start the app using docker-compose pull && docker-compose up to make sure you have the latest image
version: '2.1'
services:
  myApp:
    image: registry.gitlab.com/bullbytes/myApp:latest
    networks:
      - myApp-network
  db:
     image: postgres:9.6.1
     # Make Postgres log to a file.
     # More on logging with Postgres: https://www.postgresql.org/docs/current/static/runtime-config-logging.html
     command: postgres -c logging_collector=on -c log_destination=stderr -c log_directory=/logs
     environment:
       # Provide the password via an environment variable. If the variable is unset or empty, use a default password
       - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-4WXUms893U6j4GE&Hvk3S*hqcqebFgo!vZi}
     # If on a non-Linux OS, make sure you share the drive used here. Go to Docker's settings -> Shared Drives
     volumes:
       # Persist the data between container invocations
       - postgresVolume:/var/lib/postgresql/data
       - ./logs:/logs
     networks:
       myApp-network:
         # Our application can communicate with the database using this hostname
         aliases:
           - postgresForMyApp
networks:
  myApp-network:
    driver: bridge
# Creates a named volume to persist our data. When on a non-Linux OS, the volume's data will be in the Docker VM
# (e.g., MobyLinuxVM) in /var/lib/docker/volumes/
volumes:
  postgresVolume:

Permiso para escribir en el directorio de registro

Tenga en cuenta que en Linux, el directorio de registro del host debe tener los permisos adecuados. De lo contrario, obtendrá un error un poco engañoso

FATAL: no se pudo abrir el archivo de registro “/logs/postgresql-2017-02-04_115222.log”: Permiso denegado

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 anfitrión no permite escribir.

Para solucionar esto, configuro los permisos correctos en el host usando

chgroup ./logs docker && chmod 770 ./logs

los 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 (todo lo que se agregue antes de que la instrucción VOLUME se copie 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

igual que:

services:
  postgres:
    ...  
    command:
      - "postgres"
      - "-c"
      - "max_connections=1000"
      - "-c"
      - "shared_buffers=3GB"
      - "-c"
      ...

Inyecte postgresql.conf personalizado en el contenedor Docker de postgres

El valor por defecto postgresql.conf archivo vive dentro del PGDATA dir (/var/lib/postgresql/data), lo que hace las cosas más complicadas, especialmente cuando se ejecuta el contenedor de postgres por primera vez, ya que el docker-entrypoint.sh envoltorio invoca el initdb paso para PGDATA dir inicialización.

Para personalizar la configuración de PostgreSQL en Docker de manera consistente, sugiero usar config_file opción postgres junto con volúmenes Docker como este:

Base de datos de producción (directorio PGDATA como volumen persistente)

docker run -d 
-v $CUSTOM_CONFIG:/etc/postgresql.conf 
-v $CUSTOM_DATADIR:/var/lib/postgresql/data 
-e POSTGRES_USER=postgres 
-p 5432:5432 
--name postgres 
postgres:9.6 postgres -c config_file=/etc/postgresql.conf

Prueba de base de datos (el directorio PGDATA se descartará después docker rm)

docker run -d 
-v $CUSTOM_CONFIG:/etc/postgresql.conf 
-e POSTGRES_USER=postgres 
--name postgres 
postgres:9.6 postgres -c config_file=/etc/postgresql.conf

Depuración

  1. Eliminar el -d (opción de separar) de docker run comando para ver los registros del servidor directamente.
  2. Conéctese al servidor de postgres con el cliente psql y consulte la configuración:

    docker run -it --rm --link postgres:postgres postgres:9.6 sh -c 'exec psql -h $POSTGRES_PORT_5432_TCP_ADDR -p $POSTGRES_PORT_5432_TCP_PORT -U postgres'
    
    psql (9.6.0)
    Type "help" for help.
    
    postgres=# SHOW all;
    
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *