sql >> Database >  >> RDS >> PostgreSQL

Hoe het configuratiebestand van de officiële PostgreSQL Docker-afbeelding aanpassen?

Met Docker Compose

Wanneer u met Docker Compose werkt, kunt u command: postgres -c option=value in uw docker-compose.yml om Postgres te configureren.

Hierdoor logt Postgres bijvoorbeeld in een bestand:

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

Door het antwoord van Vojtech Vitek aan te passen, kunt u

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

om het configuratiebestand te wijzigen dat Postgres zal gebruiken. U koppelt uw aangepaste configuratiebestand aan een volume:

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

Hier is de docker-compose.yml van mijn applicatie, die laat zien hoe je Postgres configureert:

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

Toestemming om naar de logmap te schrijven

Merk op dat bij Linux de logmap op de host de juiste rechten moet hebben. Anders krijg je de enigszins misleidende foutmelding

FATAL:kan logbestand niet openen"/logs/postgresql-2017-02-04_115222.log":Toestemming geweigerd

Ik zeg misleidend, omdat de foutmelding suggereert dat de map in de container heeft de verkeerde toestemming, terwijl in werkelijkheid de directory op de host staat schrijven niet toe.

Om dit op te lossen, heb ik de juiste rechten op de host ingesteld met

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


  1. Vensterfuncties of algemene tabeluitdrukkingen:tel vorige rijen binnen bereik

  2. MySQL Rollup gebruiken

  3. mySQL - Een nieuwe tabel maken met gegevens en kolommen uit drie tabellen

  4. Opdrachten lopen niet synchroon; je kunt deze opdracht nu niet uitvoeren