PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come personalizzare il file di configurazione dell'immagine Docker di PostgreSQL ufficiale?

Con Docker Compose

Quando lavori con Docker Compose, puoi usare command: postgres -c option=value nel tuo docker-compose.yml per configurare Postgres.

Ad esempio, questo fa sì che Postgres registri in un file:

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

Adattando la risposta di Vojtech Vitek, puoi usare

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

per cambiare il file di configurazione che Postgres utilizzerà. Montare il file di configurazione personalizzato con un volume:

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

Ecco il docker-compose.yml della mia applicazione, mostrando come configurare 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:

Autorizzazione a scrivere nella directory di log

Nota che quando sei su Linux, la directory di registro sull'host deve avere i permessi corretti. Altrimenti otterrai un errore leggermente fuorviante

FATAL:impossibile aprire il file di registro"/logs/postgresql-2017-02-04_115222.log":Permesso negato

Dico fuorviante, poiché il messaggio di errore suggerisce che la directory nel contenitore ha il permesso sbagliato, quando in realtà la directory sull'host non permette di scrivere.

Per risolvere questo problema, ho impostato le autorizzazioni corrette sull'host utilizzando

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