web-dev-qa-db-ja.com

Dockerの実行がプログラムで成功したかどうかを検出する方法は?

私は非常に単純なbashスクリプトを書いて、コンテナがまだ正しくビルドおよび起動していること、および内部のアプリがリクエストに応答していることをすばやく確認しています。

時々docker runが失敗します。コンテナをバインドしようとしているポートはすでに割り当てられているためです。しかし、これが発生した場合、docker runの終了コードはまだ0なので、終了コードを使用できません。コンテナが正しく開始されたことをプログラムで確認するにはどうすればよいですか?

私が検討しているソリューションは次のとおりです。

  • エラーの出力を解析します
  • docker psは、コンテナが実行されているかどうかを確認します

しかし、これらはどちらも少しやり過ぎでseemいようです。 docker runが成功したかどうかを確認するより良い方法がありませんか?

78
Jules Olléon

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(またはそれ以上)したいことに注意してください。セットアップに何か問題がある場合、実際に終了する前に非常に短時間「実行中」と表示される可能性があります。

113
Jules Olléon

解析を避けるために、docker topを使用できます。これは、コンテナが実行されていない場合に1を返します。

id=$(docker run mycontainer)
if ! docker top $id &>/dev/null
then
    echo "Container crashed unexpectedly..."
    return 1
fi
21
pedroapero

docker exec $id true 2>/dev/null || echo not runningを使用できます。

このコマンドは、「docker top」のようにstdoutに書き込みません。コンテナが実行されていないときにstderrに書き込みます。「docker top」と同じメッセージです。

9
simohe

私は使用しなければなりませんでした:

$ 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
lvthillo

前述の提案をスクリプトに適用します。

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コンテナーが再びダウンする心配はありません。

それが役に立てば幸い...

;-)

0
Israel