How to increase max_connection in the official PostgreSQL Docker image

run this docker-compose.yml

version: '2'
services:
  postgres:
    image: postgres:10.3-alpine
    command: postgres -c 'max_connections=200'
    environment:
      POSTGRES_DB: pgdb
      POSTGRES_PASSWORD: postgres
      POSTGRES_USER: postgres
    stdin_open: true
    tty: true
    ports:
    - 5432:5432/tcp

It is as simple as (you just override the default CMD with postgres -N 500):

docker run -d --name db postgres:10 postgres -N 500

You can check it using:

docker run -it --rm --link db:db postgres psql -h db -U postgres

show max_connections;

max_connections 
-----------------
500
(1 row)

The official image provides a way to run arbitrary SQL and shell scripts after the DB is initialized by putting them into the /docker-entrypoint-initdb.d/ directory. This script:

ALTER SYSTEM SET max_connections = 500;

will let us change the maximum connection limit. Note that the postgres server will be restarted after the initializing scripts are run, so even settings like max_connections that require a restart will go into effect when your container starts for the first time.

How you attach this script to the docker container depends on how you are starting it:

Docker

Save the SQL script to a file max_conns.sql, then use it as a volume:

docker run -it -v $PWD/max_conns.sql:/docker-entrypoint-initdb.d/max_conns.sql postgres

Docker Compose

With docker compose, save the SQL script to a file max_conns.sql next to your docker-compose.yaml, and than reference it:

version: '3'
services:
  db:
    image: postgres:latest
    volumes:
      - ./max_conns.sql:/docker-entrypoint-initdb.d/max_conns.sql

Kubernetes

With kubernetes, you will need to create a configmap for the script:

kind: ConfigMap 
apiVersion: v1 
metadata:
  name: max-conns
data:
  max_conns.sql: "ALTER SYSTEM SET max_connections = 500;"

And then use it with a container:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres-example
spec:
  template:
    spec:
      containers:
        - name: postgres
          image: postgres:latest
          volumeMounts:
          - name: max-conns
            mountPath: /docker-entrypoint-initdb.d
      volumes:
        - name: max-conns
          configMap:
            name: max-conns