summaryrefslogtreecommitdiff
path: root/docker
diff options
context:
space:
mode:
authorkfei <kfei@kfei.net>2014-12-17 00:53:17 -0800
committerkfei <kfei@kfei.net>2015-02-24 19:20:57 +0800
commit9338c6325263d950966e87ddb23095075f18558e (patch)
tree1905923b5439630d794830436b777d3b000bb8b7 /docker
parentc8e9eac25f384ece01de756a808fffddfc578546 (diff)
downloadgitlab-ce-9338c6325263d950966e87ddb23095075f18558e.tar.gz
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>
Diffstat (limited to 'docker')
-rw-r--r--docker/.dockerignore1
-rw-r--r--docker/Dockerfile11
-rw-r--r--docker/assets/gitlab.rb (renamed from docker/gitlab.rb)0
-rwxr-xr-xdocker/assets/wrapper17
4 files changed, 25 insertions, 4 deletions
diff --git a/docker/.dockerignore b/docker/.dockerignore
new file mode 100644
index 00000000000..dd449725e18
--- /dev/null
+++ b/docker/.dockerignore
@@ -0,0 +1 @@
+*.md
diff --git a/docker/Dockerfile b/docker/Dockerfile
index cfb89357a67..3a0a55e18e3 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -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 \ No newline at end of file
+# 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"]
diff --git a/docker/gitlab.rb b/docker/assets/gitlab.rb
index 7fddf309c01..7fddf309c01 100644
--- a/docker/gitlab.rb
+++ b/docker/assets/gitlab.rb
diff --git a/docker/assets/wrapper b/docker/assets/wrapper
new file mode 100755
index 00000000000..9e6e7a05903
--- /dev/null
+++ b/docker/assets/wrapper
@@ -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