Dockerコンテナーで停止したメインプロセスを調査するにはどうすればよいですか?


13

停止しているコンテナや、起動後に非常に速く停止して停止するコンテナを調査する必要がある場合があります。

docker exec -ti <id> bash 実行中のコンテナでのみ機能し、終了すると、bashプロンプトも終了します。

ではdocker start、あなたは別のコマンドを供給することができない、とコンテナが突然再び死ぬ場合は、コンテナに入ると、あなたの調査を行うのに十分な時間がありません。

我々は行うことができdocker commit、その後、docker run別のコマンドを使用して新しいイメージではなく、他の選択肢がある場合、私は思ったんだけど。

docker logs印刷されたアプリをstdout / stderrに返すだけです。それは問題が何であったかを理解するのに十分ではないかもしれません。


しばらく考えてから:Dockerのメインプロセス???? コンテナーは1つのプロセスのみを実行することを目的としているため、「メイン」という用語を削除するか、または(initプロセスの実行など)奇妙なことを行っているか、またはスレッドをプロセスとして使用しています...オプション1、しかし私はそれが私を困らせるのでそれを言わなければなりません
でし

@Tensibaiメインコマンドがそれ自体を処理できない場合、コンテナー内のpid 1 /シグナリングの問題を処理するために、dumb-initなどを実行する必要がある場合があります。
Docker

はい、それは主にコンテナーがプロセスを分離するために作られたため、私が奇妙なものと呼んでいます。時々、コンテナーはアプリのソリューションではありません。コンテナー内にすべてを入れようとすることは、他の何よりも頭痛の種への道です。
Tensibai 2017年

回答:


9

Linuxのプロセスが失敗した理由を追跡する一般的な方法は適切です。そのような方法の1つは、プロセスを使用しstraceてプロセスを実行することです。これにより、プロセスが実行したシステムコールが通知され、通常は失敗の理由が示されます。

Dockerfile次のようなを作成できます。

FROM original_image

RUN apt-get -y update && apt-get install -y strace

# build with `docker build -t debug_version`

次に、を使用して新しいイメージを実行しますdocker run debug_version strace original_cmd

子をフォークする(そして死ぬ)プロセスでstraceは、-ffオプションを指定して実行する必要があります。また、Dockerデータボリュームを使用して一部のファイルをマッピングし、-ofromオプションを使用してそこstraceに書き込むこともできます。しかし、一般的にstraceはstdoutに出力を残しますdocker log。これはを使用して読み取ることができます。

関連Q:Linuxプロセスが不思議な形で終了します


これはdocker commit、開始するイメージを
取得

あなたはそれが最初に死ぬと言いました。その時あなたはイメージを持っていると思います。停止している場合は、はい、コミットが必要です。
Evgeny

これは停止したコンテナを取得するシナリオの1つにすぎません
SztupY 2017年

straceAlpine Linuxには、pkgs.alpinelinux.org / package / edge / main / x86_64 / straceのパッケージもあります。Alpine Package Managerを使用してインストールしapk install straceます。
エフゲニー

3

私が知る限り、commitそしてrunコンテナーが死んだときと同じようにコンテナーに完全にアクセスできるようにするための最良のオプションです。

理想的には、コンテナーが失敗すると、より有用な情報が出力されますが、それはまったく別のトピックです。

編集:コンテナは右スタートで死にかけている場合、あなたも使用することができ、私の答えを拡大するdocker run代替手段を指定する--entrypointCMD。通常、これをループまたはそれ自体では終了しないものに設定します。コンテナーに入ったら、失敗したステップを手動で実行し、コンテナーの終了を心配することなく結果を検査できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.