Gracefully shutdown services in Docker container
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: 1) Add a wrapper as the default executable of Docker container. Which starts services through `runit`, reconfigure Gitlab by `gitlab-ctl` and gracefully shutdown all services when a SIGTERM is received. 2) Create an `assets` directory for assets. 3) 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>
This commit is contained in:
parent
c8e9eac25f
commit
9338c63252
4 changed files with 25 additions and 4 deletions
1
docker/.dockerignore
Normal file
1
docker/.dockerignore
Normal file
|
@ -0,0 +1 @@
|
|||
*.md
|
|
@ -26,9 +26,12 @@ RUN mkdir -p /opt/gitlab/sv/sshd/supervise \
|
|||
# Expose web & ssh
|
||||
EXPOSE 80 22
|
||||
|
||||
# Volume & configuration
|
||||
# Declare volumes
|
||||
VOLUME ["/var/opt/gitlab", "/var/log/gitlab", "/etc/gitlab"]
|
||||
ADD gitlab.rb /etc/gitlab/
|
||||
|
||||
# Default is to run runit & reconfigure
|
||||
CMD gitlab-ctl reconfigure & /opt/gitlab/embedded/bin/runsvdir-start
|
||||
# Copy assets
|
||||
COPY assets/gitlab.rb /etc/gitlab/
|
||||
COPY assets/wrapper /usr/local/bin/
|
||||
|
||||
# Wrapper to handle signal, trigger runit and reconfigure GitLab
|
||||
CMD ["/usr/local/bin/wrapper"]
|
||||
|
|
17
docker/assets/wrapper
Executable file
17
docker/assets/wrapper
Executable file
|
@ -0,0 +1,17 @@
|
|||
#!/bin/bash
|
||||
|
||||
function sigterm_handler() {
|
||||
echo "SIGTERM signal received, try to gracefully shutdown all services..."
|
||||
gitlab-ctl stop
|
||||
}
|
||||
|
||||
trap "sigterm_handler; exit" TERM
|
||||
|
||||
function entrypoint() {
|
||||
# Default is to run runit and reconfigure GitLab
|
||||
gitlab-ctl reconfigure &
|
||||
/opt/gitlab/embedded/bin/runsvdir-start &
|
||||
wait
|
||||
}
|
||||
|
||||
entrypoint
|
Loading…
Reference in a new issue