質問: ### 経緯 ruby on railsで開発をしています。ソースコードの管理に、gitlabを使用することになりました。 gitlab ciで、gitlabにpushした際にテストコードを走らせ、テストのカバレッジを表示する、というところまでは自力でできました。 ### やりたいこと テストをパスしたものを、dockerに自動デプロイしたい ### 使用しているもの gitlab community edition 8.17 shared runnerはdocker executorです。 dockerfileからイメージを作っています。 dindを試したので、privilaged=trueになっています。 ### やったこと 1. specific runnerとしてshell executorのrunnerを作り、docker buildしてみた →エラーが出たが、文字化けしていて読めない(エラーコード9009) 2. sharedでdind →runnerが閉じると作ったコンテナも消える、docker inspectするとIPアドレスがない 3. sharedでdindしないでdocker buildしてみる →is daemon running?と言われる →daemonを起こそうとするとエラーが出る(socketエラー) 4. socketを共有?する(dindはあまりよくないという記事を読んだため) →はじめは良かったが、docker runしてもすぐにexitするようになった、やはりrunnerが閉じると消える ### 制約 * gitlabのバージョンを上げることは難しいです。 * shared runnerは、私は触れません。 runnerからdockerコンテナを外に作り、デプロイするというのは難しいでしょうか。 また、調べているとcapistranoを使用したものをよく見かけるのですが、dockerにデプロイするのにも利用できるでしょうか。gitlabにはenvironmentsという項目があり、environments:~~~と書くとデプロイできるようなので、現時点ではそれを利用しようと思っています。 よろしくお願いします。
回答: 同じくgitlab-ciを使っています。個人的な理解ではdockerは使い捨てのビルド環境の整備に使う用途がメインで、runnerを使って永続的なコンテナを立ち上げるのは想定されていないという理解です。 runner終了時にexecutorが起動した子プロセス(おそらくdockerを含む)はKillされるので、blancccさんの環境でも同じことが起こっているのではないかと推測されます。 Gitlab > > With this release, Runner creates a single temporary bash script which contains all the commands the build needs. The script itself is then executed as a child process in its own session (process group) by the runner. This way we can ensure that killing the script also kills all its child processes. > > > ちなみにshared runnerからdetachedモード(-d)でdocker runするとどうなりますか?(ただこのやり方だとゾンビプロセスがビルドサーバ上に蓄積されていくので、新しいものを立ち上げる前に、きちんと古いコンテナのUUIDを探してkillする必要があります) 個人的には、開発サーバへのデプロイはdocker-composeを使って、 docker build docker-compose pull docker-compose restart のようにしています。こうするとdocker-composeが最新のイメージに更新して、自動的にタグを見つけて現在起動中のコンテナを再起動してくれます。なのでpsしてuuidをgrepしてというようなことをしなくてもよくなります。