CIに関連する作業の中でコンテナ上でコンテナ動かしたかったのでDinDを触っていた時の知見
DinDコンテナと、その上で動くコンテナはそれぞれDinDコンテナ
とコンテナ
で単語を使い分けてます。
結論
DinDコンテナ内で/var/run/docker.pid
を見ていれば良いらしい。
デーモンが起動した後に生成される、dockerのpidが書かれたファイル
ハマった事
スクリプト1つ実行させるだけでDinDコンテナ起動、DinDコンテナ内でコンテナ起動、色んな作業/テスト実行とかやりたかったのですがDinDコンテナ起動直後はDockerデーモンが立ち上がりきっておらず、デーモン動いてる?とエラーを吐かれます。
最初は無理やりsleep 10
とかつけていたのですがこれはもちろんアンチパターンです。
時間で待機するのはよろしくないので、何かデーモンが起動したと確実に分かる方法が欲しかったので調べていた所、ここにpidファイルを吐き出すパスを指定するオプションがあることを見つけました。pid吐き出されるならデーモンも起動しているだろって事で上記を解決出来ました。
例
例えばこんなスクリプト書いて
#!/bin/bash
while :
do
if [ -e /var/run/docker.pid ]; then
break
fi
done
exit 0
こんなのも書き
#!/bin/bash
docker run --privileged --name test -v `pwd`/wait.sh:/wait.sh -d docker:dind
docker exec test sh /wait.sh
docker exec test docker run hello-world
あとは
$ sh start.sh
を実行してみます。
start.shのdocker exec test sh /wait.sh
をコメントアウトしてみると分かりますが、wait.shがDinDコンテナ内で実行されたおかげでhello-worldもといHello Dockerが実行されます。