Preventing the Docker container from exiting when the main process dies

1.4k views Asked by At

I am using Postgres with repmgr, one of the small problems I am having is that sometimes repmgr will have to stop and start the Postgres service and that will just kill the container, I tried some of the solutions online in the Dokcerfile but none seems to work, is there something I can add in the docker-compose file to prevent docker from exiting immediately, I don't want to stay alive forever, but maybe couple minutes?

2

There are 2 answers

0
acran On

The way docker is designed it will start a new container by starting the command specified as entrypoint/command to it and when this process terminates docker will kill all remaining processes in that container and shut it down.

So to keep the container running while the Postgres process is restarted you need to have another command running as the root process in the container.

You can achieve this by writing a simple shell script as a wrapper which will only exit when no Postgres process is running anymore or by using a dedicated init tool such as supervisord.

0
user2932688 On

Remember that docker-composer is mostly development thing. For production there are other ways, like kubernetes.

The only solution i know is to run our own .sh script as main process, which would have infinite loop with necessary checks in it.

This way you can control how to check - like ps aux and grep what you need. and exit main process if you need to by doing logic.

sh scrip would look something like:

while sleep 180; do
  ps aux |grep postgres_service_name |grep -v grep
  POSTGRESS=$?

  if [ $POSTGRESS -ne 0 ]; then
# do what you need before exiting whole container
    exit 1
  fi

done

make sure you replace postgres_service_name with real name of Postgres service on linux.

Use that script as a startup script in docker compose or whatever you would use in prod.

if you really need 2 minutes before it is off - i would implement logic which would measure time after first time process is not there