I’m using postgres:12
Docker image on AWS instance under Ubuntu 20.04.
postgres-tests:
image: "postgres:12"
restart: always
command: postgres -c 'max_connections=200'
environment:
POSTGRES_DB: "${POSTGRES_DATABASE}"
POSTGRES_USER: "${POSTGRES_USER}"
POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
ports:
- "8396:5432"
When running this container with docker-compose up -d
it fails to start with the following error:
postgres-tests_1 | popen failure: Cannot allocate memory
postgres-tests_1 | initdb: error: The program "postgres" is needed by initdb but was not found in the
postgres-tests_1 | same directory as "/usr/lib/postgresql/12/bin/initdb".
postgres-tests_1 | Check your installation.
The error appeared suddenly after most-resent project deploy. The important thing is that the error happens only with this particular container. There is one more postgresql:12
container on the machine for another project, which works fine.
HERE IS WHAT I TRIED:
- I’ve found several suggestions related to increasing the
shmall
/shmmax
params controlling shared memory on the machine.
But these system params are already set to high value:
ubuntu@ip-172-31-10-246:/var/www$ cat /proc/sys/kernel/shmall
18446744073692774399
ubuntu@ip-172-31-10-246:/var/www$ cat /proc/sys/kernel/shmmax
18446744073692774399
ubuntu@ip-172-31-10-246:/var/www$
-
The second suggested option was to try a newer postgres image. Tested with postgres 13.0, 14.0 with no effect.
UPDATE
Tried withpostgres:11
image and it runs OK, but I can not roll down postgres version in production, so it’s not a solution in my case. -
I tried to stop/start and reboot the instance, also cleaning up docker cache with
docker system prune
anddocker volumes prune
.
Software:
Ubuntu 20.04.2
Docker version 20.10.8, build 3967b7d
Instance hardware:
Intel(R) Xeon(R) Platinum 8124M CPU @ 3.00GHz
RAM: 4/8GB Used by system and other services
Swap: 4.5/20GB Used by system and other services
2
Answers
Looks like it was some kind of version incompatibility between Docker
5:20.10.8~3-0~ubuntu-focal
and one of recent updates of the officialpostgres:12
image.Updating Docker to
5:23.0.6-1~ubuntu.20.04~focal
solved the issue.Maintainers of the postgres docker images have updated the underlying OS image layer:
Previous: Debian 11 (bullseye)
New: Debian 12 (bookworm)
This was pushed up to hub.docker.com on 15 Jun 2023.
The move to this container is causing a lot of builds to throw errors and exceptions like the one noted in the question:
initdb: error: The program "postgres" is needed by initdb but was not found in the same directory as "/usr/lib/postgresql/12/bin/initdb".
The mitigation route is to use the following conatiner:
postgres:12-bullseye
The maintainers will keep providing
bullseye
variants until the Postgres version is EOL or Debian moves to their latestTrixie
Issues can be found here:
program “postgres” is needed by initdb but was not found