背景
GitLab CIでdocker imageをビルドするJobがコケる原因を調べていたら、どうもdocker info
をした時にコケていることが分かった。
dockerはクライアント - サーバー型のアプリケーションだが、サーバー側であるdocker daemonが起動してくる前にdocker info
コマンド打ったりすると「daemonがないんですけど…」と怒られてしまう。
Cannot connect to the Docker daemon at tcp://docker:2375. Is the docker daemon running?
docker in dockerであるdind
は正しく使用しており、本当にただ起動が遅れているだけなので、sleep 10
のように待つとビルドは通る。しかし謎のsleepはつけたくないので、daemonが起動してくるまで待つようにしたい。
やったこと
シェルスクリプトを書いてプロジェクトに追加した。
幸い、daemonがないとdocker infoがエラーとなることが分かっているので、それを利用する。
wait.sh
#!/bin/sh
# dindのdocker daemonが起動するまで待つスクリプト
while :
do
if docker info > /dev/null 2>&1; then
break
fi
echo 'waiting docker daemon...'
sleep 1
done
exit 0
.gitlab-ci.ymlのdocker info
よりも前にスクリプトを仕込む。実行可能にするためにchmodも忘れない。
.gitlab-ci.yml
before_script:
- chmod u+x wait.sh && ./wait.sh
- docker info
結果
起動を待つようになってくれてビルドが失敗することがなくなった。