私は非常に単純なbashスクリプトを書いて、コンテナがまだ正しくビルドおよび起動していること、および内部のアプリがリクエストに応答していることをすばやく確認しています。
時々docker run
が失敗します。コンテナをバインドしようとしているポートはすでに割り当てられているためです。しかし、これが発生した場合、docker run
の終了コードはまだ0なので、終了コードを使用できません。コンテナが正しく開始されたことをプログラムで確認するにはどうすればよいですか?
私が検討しているソリューションは次のとおりです。
docker ps
は、コンテナが実行されているかどうかを確認しますしかし、これらはどちらも少しやり過ぎでseemいようです。 docker run
が成功したかどうかを確認するより良い方法がありませんか?
AbelMuiñoのコメントで示唆されているように、これは最近のDockerバージョンで修正された可能性があります(現在0.9.1を実行しています)。
しかし、一時的に古いバージョンを使用している場合、docker inspect
を使用してコンテナが起動したかどうかを確認するための適切な回避策を見つけました。
docker inspect
は、コンテナに関する多くの情報、特にコンテナが現在実行中かどうかを含むJSONオブジェクトを返します。 -f
フラグを使用すると、必要なビットを簡単に抽出できます。
docker inspect -f {{.State.Running}} $CONTAINER_ID
または
docker inspect -f "{{.State.Running}}" $CONTAINER_ID
true
またはfalse
を返します。
コンテナを起動してから起動しているかどうかを確認するまでに、おそらくsleep 1
(またはそれ以上)したいことに注意してください。セットアップに何か問題がある場合、実際に終了する前に非常に短時間「実行中」と表示される可能性があります。
解析を避けるために、docker topを使用できます。これは、コンテナが実行されていない場合に1を返します。
id=$(docker run mycontainer)
if ! docker top $id &>/dev/null
then
echo "Container crashed unexpectedly..."
return 1
fi
docker exec $id true 2>/dev/null || echo not running
を使用できます。
このコマンドは、「docker top」のようにstdoutに書き込みません。コンテナが実行されていないときにstderrに書き込みます。「docker top」と同じメッセージです。
私は使用しなければなりませんでした:
$ docker inspect -f {{.State.Health.Status}} xxx
(コンテナは実行中の状態でしたが、コンテナ内のサービスは完全には開始されていませんでした。
検査出力の一部:
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 1618,
"ExitCode": 0,
"Error": "",
"StartedAt": "2019-03-08T10:39:24.061732398Z",
"FinishedAt": "0001-01-01T00:00:00Z",
"Health": {
"Status": "starting",
"FailingStreak": 0,
"Log": []
前述の提案をスクリプトに適用します。
1-スクリプトを作成しますkeepMyDockerUp.sh:
vi keepMyDockerUp.sh
#!/bin/bash
Container_ID=INSERT_YOUR_CONTAINER_ID HERE
result=$( docker inspect -f {{.State.Running}} $Container_ID)
echo "result is" $result
if [ $result = "true" ]
then
echo "docker is already running"
else
systemctl restart docker
docker start $Container_ID
fi
2-それを単純にcronに追加して、スクリプトでDockerコンテナーが時々稼働しているかどうかを確認します。
crontab -e
最後の行に移動して、スクリプトファイルを追加します。例えば:
* * * * * /root/keepMyDockerUp.sh
3-crontabを保存し、Dockerコンテナーが再びダウンする心配はありません。
それが役に立てば幸い...
;-)