2014-11-27 09:48:19 -05:00
|
|
|
FROM ubuntu:14.04
|
|
|
|
|
|
|
|
# Install required packages
|
|
|
|
RUN apt-get update -q \
|
2014-12-17 01:11:50 -05:00
|
|
|
&& DEBIAN_FRONTEND=noninteractive apt-get install -qy --no-install-recommends \
|
|
|
|
ca-certificates \
|
2014-12-02 09:19:43 -05:00
|
|
|
openssh-server \
|
2014-12-17 01:11:50 -05:00
|
|
|
wget
|
2014-11-27 09:48:19 -05:00
|
|
|
|
|
|
|
# Download & Install GitLab
|
2014-12-04 06:29:30 -05:00
|
|
|
# If the Omnibus package version below is outdated please contribute a merge request to update it.
|
2014-12-04 05:03:40 -05:00
|
|
|
# If you run GitLab Enterprise Edition point it to a location where you have downloaded it.
|
2014-11-27 09:48:19 -05:00
|
|
|
RUN TMP_FILE=$(mktemp); \
|
2015-03-23 08:11:38 -04:00
|
|
|
wget -q -O $TMP_FILE https://downloads-packages.s3.amazonaws.com/ubuntu-14.04/gitlab_7.9.0-omnibus.2-1_amd64.deb \
|
2014-11-27 09:48:19 -05:00
|
|
|
&& dpkg -i $TMP_FILE \
|
|
|
|
&& rm -f $TMP_FILE
|
|
|
|
|
|
|
|
# Manage SSHD through runit
|
|
|
|
RUN mkdir -p /opt/gitlab/sv/sshd/supervise \
|
|
|
|
&& mkfifo /opt/gitlab/sv/sshd/supervise/ok \
|
|
|
|
&& printf "#!/bin/sh\nexec 2>&1\numask 077\nexec /usr/sbin/sshd -D" > /opt/gitlab/sv/sshd/run \
|
|
|
|
&& chmod a+x /opt/gitlab/sv/sshd/run \
|
|
|
|
&& ln -s /opt/gitlab/sv/sshd /opt/gitlab/service \
|
|
|
|
&& mkdir -p /var/run/sshd
|
|
|
|
|
|
|
|
# Expose web & ssh
|
|
|
|
EXPOSE 80 22
|
|
|
|
|
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>
2014-12-17 03:53:17 -05:00
|
|
|
# Declare volumes
|
2014-11-27 09:48:19 -05:00
|
|
|
VOLUME ["/var/opt/gitlab", "/var/log/gitlab", "/etc/gitlab"]
|
|
|
|
|
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>
2014-12-17 03:53:17 -05:00
|
|
|
# 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"]
|