PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie passt man die Konfigurationsdatei des offiziellen PostgreSQL-Docker-Images an?

Mit Docker Compose

Wenn Sie mit Docker Compose arbeiten, können Sie command: postgres -c option=value verwenden in Ihrer docker-compose.yml um Postgres zu konfigurieren.

Dies führt beispielsweise dazu, dass Postgres in einer Datei protokolliert:

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

Wenn Sie die Antwort von Vojtech Vitek anpassen, können Sie

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

um die Konfigurationsdatei zu ändern, die Postgres verwendet. Sie würden Ihre benutzerdefinierte Konfigurationsdatei mit einem Volume mounten:

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

Hier ist die docker-compose.yml meiner Anwendung, die zeigt, wie man Postgres konfiguriert:

# 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:

Berechtigung zum Schreiben in das Protokollverzeichnis

Beachten Sie, dass das Protokollverzeichnis auf dem Host unter Linux die richtigen Berechtigungen haben muss. Andernfalls erhalten Sie den leicht irreführenden Fehler

SCHWERWIEGEND:Protokolldatei „/logs/postgresql-2017-02-04_115222.log“ konnte nicht geöffnet werden:Berechtigung verweigert

Ich sage irreführend, da die Fehlermeldung suggeriert, dass sich das Verzeichnis im Container befindet hat die falsche Berechtigung, obwohl in Wirklichkeit das Verzeichnis auf dem Host liegt erlaubt kein Schreiben.

Um dies zu beheben, setze ich die richtigen Berechtigungen auf dem Host mit

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