sql >> Base de Datos >  >> RDS >> PostgreSQL

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

Con Docker Compose

Cuando trabaje con Docker Compose, puede usar el comando command: postgres -c option=value en su docker-compose.yml para configurar Postgres.

Por ejemplo, esto hace que Postgres se 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í está el 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
       # Explanation of this shell feature: https://unix.stackexchange.com/questions/122845/using-a-b-for-variable-assignment-in-scripts/122848#122848
       - 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 cuando está en Linux, el directorio de registro en el host debe tener los permisos correctos. De lo contrario, obtendrá un error ligeramente 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 host no permite escribir.

Para solucionar esto, configuré los permisos correctos en el host usando

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