How to customize the configuration file of the official PostgreSQL Docker image?

后端 未结 11 2062
时光取名叫无心
时光取名叫无心 2020-11-29 16:11

I\'m using the official Postgres Docker image trying to customize its configuration. For this purpose, I use the command sed to change max_connections

11条回答
  •  清酒与你
    2020-11-29 16:24

    With Docker Compose

    When working with Docker Compose, you can use command: postgres -c option=value in your docker-compose.yml to configure Postgres.

    For example, this makes Postgres log to a file:

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

    Adapting Vojtech Vitek's answer, you can use

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

    to change the config file Postgres will use. You'd mount your custom config file with a volume:

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

    Here's the docker-compose.yml of my application, showing how to configure 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:
    

    Permission to write to the log directory

    Note that when on Linux, the log directory on the host must have the right permissions. Otherwise you'll get the slightly misleading error

    FATAL: could not open log file "/logs/postgresql-2017-02-04_115222.log": Permission denied

    I say misleading, since the error message suggests that the directory in the container has the wrong permission, when in reality the directory on the host doesn't permit writing.

    To fix this, I set the correct permissions on the host using

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

提交回复
热议问题