web-dev-qa-db-ja.com

領事ヘルスチェックの実行後、ステータスが「Dead」のDockerコンテナ

私は領事のヘルスチェック機能を使用していますが、これらの「デッド」コンテナを取得し続けています。

CONTAINER ID  IMAGE                   COMMAND              CREATED         STATUS              PORTS                                                                                                                                                                    NAMES
20fd397ba638  progrium/consul:latest  "\"/bin/bash -c 'cur 15 minutes ago  Dead

正確には「デッド」コンテナとは何ですか?停止したコンテナはいつ「デッド」になりますか?

記録のために、progrium/consul + gliderlabs/registerrator images + SERVICE_XXXX_CHECKenv変数を実行してヘルスチェックを実行します。 docker run --rm my/img healthcheck.shのようにX秒ごとに画像を実行するヘルスチェックスクリプトを実行します

私は一般的に「死んだ」とはどういう意味か、そしてそれが起こらないようにする方法に興味があります。もう一つの独特なことは、私の死んだコンテナには名前がないということです。

これは、コンテナ検査からの情報です。

  "State": {
        "Dead": true,
        "Error": "",
        "ExitCode": 1,
        "FinishedAt": "2015-05-30T19:00:01.814291614Z",
        "OOMKilled": false,
        "Paused": false,
        "Pid": 0,
        "Restarting": false,
        "Running": false,
        "StartedAt": "2015-05-30T18:59:51.739464262Z"
    },

奇妙なことに、たまにしかコンテナが死んで、取り外されないのです。

ありがとうございました

編集:ログを見て、コンテナの停止が失敗する原因を見つけました:

  Handler for DELETE /containers/{name:.*} returned error: Cannot destroy container 003876e41429013e46187ebcf6acce1486bc5011435c610bd163b159ba550fbc: 
Driver aufs failed to remove root filesystem 003876e41429013e46187ebcf6acce1486bc5011435c610bd163b159ba550fbc: 
rename /var/lib/docker/aufs/diff/003876e41429013e46187ebcf6acce1486bc5011435c610bd163b159ba550fbc 
/var/lib/docker/aufs/ diff/003876e41429013e46187ebcf6acce1486bc5011435c610bd163b159ba550fbc-removing: 
device or resource busy

なぜこれが起こるのですか?

edit2:これが見つかりました: https://github.com/docker/docker/issues/9665

14

2016年3月の更新: issue 9665PR 21107 (docker 1.11の場合)によってクローズされました
これは、「ドライバーaufsがルートファイルシステムの削除に失敗しました」、「デバイスまたはリソースがビジー」の問題を回避するのに役立つはずです。


元の回答2015年5月

コンテナの状態 の場合、デッドは1つです。これは、 Container.Start() によってテストされます。

_if container.removalInProgress || container.Dead {
        return fmt.Errorf("Container is marked for removal and cannot be started.")
}
_

コンテナが再起動しないようにするために、 停止に失敗するとDeadを設定 です。

考えられる失敗の原因の中で、 container.Kill() を参照してください。
これは、_kill -15_と_kill -9_の両方が失敗していることを意味します。

_// 1. Send a SIGTERM
if err := container.killPossiblyDeadProcess(15); err != nil {
    logrus.Infof("Failed to send SIGTERM to the process, force killing")
    if err := container.killPossiblyDeadProcess(9); err != nil {
_

これは通常、OPが言及しているように、ビジーなデバイスまたはリソースがプロセスの強制終了を妨げることを意味します。

14
VonC

特にEBUSYが使用されている場合、devicemapperによって引き起こされるバグがたくさんあります。

EBUSY関連のすべての問題にトラッカーのバグがあります。 https://github.com/docker/docker/issues/5684#issuecomment-69052334 を参照してください

1
dnozay