Commit 9338c632 authored by kfei's avatar kfei

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: default avatarkfei <kfei@kfei.net>
parent c8e9eac2
...@@ -26,9 +26,12 @@ RUN mkdir -p /opt/gitlab/sv/sshd/supervise \ ...@@ -26,9 +26,12 @@ RUN mkdir -p /opt/gitlab/sv/sshd/supervise \
# Expose web & ssh # Expose web & ssh
EXPOSE 80 22 EXPOSE 80 22
# Volume & configuration # Declare volumes
VOLUME ["/var/opt/gitlab", "/var/log/gitlab", "/etc/gitlab"] VOLUME ["/var/opt/gitlab", "/var/log/gitlab", "/etc/gitlab"]
ADD gitlab.rb /etc/gitlab/
# Default is to run runit & reconfigure # Copy assets
CMD gitlab-ctl reconfigure & /opt/gitlab/embedded/bin/runsvdir-start COPY assets/gitlab.rb /etc/gitlab/
\ No newline at end of file COPY assets/wrapper /usr/local/bin/
# Wrapper to handle signal, trigger runit and reconfigure GitLab
CMD ["/usr/local/bin/wrapper"]
#!/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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment