私のローカル Gitlab CE Docker コンテナには Subgit が含まれています。Gitlab コンテナーが再起動されると、Subgit 同期も自動的に開始されます。
私のソリューションは、Dockerhubの gitlab/gitlab-ce の元の Dockerfile から派生しています。元の Dockerfile では、SSH デーモンが追加され、rinit の制御下に設定されています。
Subgitでも同じことをしました。/opt/gitlab/sv/subgitの下に私の runit リソースがあり、subgit は/opt/gitlab/serviceディレクトリへのソフト リンクを設定することで有効になります。しかし、Gitlab Container を起動するとソフト リンクが削除されるため、runsvdir は Subgit runit ファイルを無視します。ソフト リンクを手動で有効にすると、runsvdir によって Subgit 同期が正常に開始されます。
ソフトリンクを保持し、Subgit の自動起動をそれぞれ有効にするにはどうすればよいですか?
Subgit と runit に関する Dockerfile の一部を次に示します。
RUN mkdir -p /opt/gitlab/sv/subgit/supervise && \
mkfifo /opt/gitlab/sv/subgit/supervise/ok && \
ln -s /opt/gitlab/sv/subgit /opt/gitlab/service/subgit
COPY ./runit_subgit_run /opt/gitlab/sv/subgit/run
COPY ./runit_subgit_finish /opt/gitlab/sv/subgit/finish
RUN chmod a+x /opt/gitlab/sv/subgit/run /opt/gitlab/sv/subgit/finish
これが runit の実行ファイルです。実際の Gitlab グループとプロジェクト名は置き換えられます。
#!/bin/sh
exec 2>&1
exec /bin/sh -c "( subgit install \
"/var/opt/gitlab/git-data/repositories/<group_1>/<project_1>.git" && \
subgit install \
"/var/opt/gitlab/git-data/repositories/<group_2>/<project_1>.git" && \
subgit register \
"/var/opt/gitlab/git-data/repositories/<group_1>/<project_1>.git" && \
subgit register \
"/var/opt/gitlab/git-data/repositories/<group_2>/<project_1>.git" )"