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:
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 with postgres: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 and docker 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
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-bullseyeThe maintainers will keep providing bullseye variants until the Postgres version is EOL or Debian moves to their latest Trixie
Issues can be found here:
program “postgres” is needed by initdb but was not foundAn alternative to using the Bullseye based Postgres images is to provide --security-opt seccomp=unconfined to the docker run command:
docker run --security-opt seccomp=unconfined postgres
This will allow you to move off the now-soon-to-EOL image, but ideally you should upgrade your Docker version and possibly host OS to support the newer Debian base images.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With