Skip to content

Gracefully shutdown services in Docker container

Created by: kfei

The problem is docker stop only sends SIGTERM to the PID 1 inside the container, and the PID 1 (/bin/sh -c ...) does not take care of signals. Hence the services (e.g., postgresql, redis, sidekiq, etc) never have chances to graceful shutdown. Docker just kills the container after its 10 seconds timeout by default.

What this commit does:

  • Add a wrapper as the entrypoint of Docker container. Which starts services through runit, reconfigure Gitlab by gitlab-ctl and gracefully shutdown all services when a SIGTERM is received.
  • Create an assets directory for assets.
  • Add .dockerignore file.

Now you'll see the following log messages after docker stop:

SIGTERM signal received, try to gracefully shutdown all services...
ok: down: logrotate: 1s, normally up
ok: down: nginx: 0s, normally up
ok: down: postgresql: 1s, normally up
ok: down: redis: 0s, normally up
ok: down: sidekiq: 0s, normally up
ok: down: unicorn: 0s, normally up

Signed-off-by: kfei kfei@kfei.net

Merge request reports