Dockerでコンテナーの実行/停止の完全なコマンドを確認する


263

Dockerで実行中のコンテナー/プロセスの完全なコマンドを確認するにはどうすればよいですか?

$ docker ps --all
CONTAINER ID    IMAGE          COMMAND                 CREATED          STATUS                     PORTS    NAMES
5b6291859b61    nginx:1.7.8    "nginx -g 'daemon of    4 minutes ago    Exited (0) 4 minutes ago            thirsty_brattain

ここでは「nginx -g 'daemon of」..のみが表示され、完全なコマンドは表示されません。


2
こちらもご覧ください。stackoverflow.com
q

回答:


545

docker ps --no-trunc 実行中のコンテナの他の詳細とともに完全なコマンドを表示します。


13
ありがとう、これは大いに役立った。ただ注: '-notrunc'は非推奨で、に置き換えられました--no-trunc
プロメテウス

2
これは私にはうまくいきませんでした。それは私にコマンドを与えましたが、すべてのスイッチではありませんでした(これは私が「フルコマンド」を使用するときに私が考えるものです)。上記の他のリンクで述べたrunlikeコマンドは、私にとってはうまく機能しました。
ディランスミス

1
実行中のコンテナのみの完全なコマンドの場合は、allコマンドを削除するだけです。docker ps --no-trunc
Jacob Morris

ありがとう-修正されました。私の以前のコマンドはすべてのコンテナーに対するもので、コンテナーを実行するだけではなく、最初の質問でした。
スコットS.

切り捨てられていないコマンドは非常に長くなる可能性があります。各行の最初の400文字のみを参照してくださいdocker ps --all --no-trunc|cut -c-400
rubo77

183

使用する:

docker inspect -f "{{.Name}} {{.Config.Cmd}}" $(docker ps -a -q)

...すべてのコンテナに対して「ドッカー検査」を行います。


8
これはdocker psコマンドを表示しません。docker psコマンドは、docker inspect PathおよびArgsに対応しています。
JDiMatteo

3
2018
sg

4
iedocker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $(docker ps -a -q)
ポール、

2
sudoコマンドの前に投げるだけの場合"docker inspect" requires at least 1 argument(s).は、すべてのコンテナ名を取得するための2回目の呼び出しが原因で取得されます。おそらく内にsudoを追加する必要があるでしょう$(
RandomInsano

より良い-fクエリを理解したい人のために、私はここで良い説明見つけたcontainer-solutions.com/docker-inspect-template-magic
intijk

16

使用する:

docker inspect -f "{{.Path}} {{.Args}} ({{.Id}})" $(docker ps -a -q)

と同様に、コマンドパスと引数が表示されdocker psます。


これをどのように変更して、などの特定のコマンドを検索しkube-apiserverますか?
ジョナサン

@ジョナサンdocker inspect -f "{{.Path}} {{.Args}} ({{.Id}})" $(docker ps -a -q) | grep kube-apiserver
rrw

8

gitリポジトリhttps://github.com/lavie/runlikeからrunlikeを使用します

runlikeをインストールするには

pip install runlike

コンテナIDを引数として受け入れるため、コンテナIDを抽出するには、次のコマンドを使用します

docker ps -a -q

runlikeを使用して、次のコマンドで完全なdocker runコマンドを抽出することをお勧めします

runlike <docker container ID>

動作しません。「コマンド '[' docker '、' inspect '、u'06e6a369f909'] 'がゼロ以外の終了ステータス1を
返しました

私が言ったようにrunlikeをインストールしましたか
Abhishek Jain

5
さらに良いことに、あなたは、ドッキングウィンドウコンテナ内runlikeを実行し、それをインストールしないことができます:docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER
ディラン・スミス

3

TL-DR

docker ps --no-truncdocker inspect CONTAINER渡されたコマンドに沿って、コンテナーを開始するために実行されたエントリーポイントを提供し${ANY_VAR}ますが、コンテナー環境変数が解決されたものとして出力されないなど、一部のパーツが欠落する場合があります。

これを克服するにdocker inspect CONTAINERは、env変数とコンテナーで定義されたそれらの値をConfig.Envプロパティから個別に取得できるため、利点があります。

docker psdocker inspect実行されたエントリポイントとそのコマンドに関する情報を提供します。多くの場合、これはラッパーエントリポイントスクリプト(.sh)であり、コンテナーによって開始される「実際の」プログラムではありません。それに関する情報を入手するには、psまたは/proc/1/cmdlineヘルプを使用してプロセス情報を要求します。


1) docker ps --no-trunc

エントリポイントと実行中のすべてのコンテナに対して実行されたコマンドを出力します。エントリポイントに渡されたコマンドを出力しますが(それを渡した場合)、Dockerの環境変数($FOOまたはなど${FOO})の値は表示されません。
コンテナーがenv変数を使用している場合は、十分ではない可能性があります。

たとえば、高山コンテナを実行します。

docker run --name alpine-example -e MY_VAR=/var alpine:latest sh -c 'ls $MY_VAR'

docker -psなどを使用する場合:

docker ps -a --filter name = alpine-example --no-trunc

それは印刷します:

コンテナーIDイメージコマンド作成されたステータスポート名
5b064a6de6d8417 ... alpine:latest "sh -c 'ls $ MY_VAR'" 2分前に終了(0)2分前alpine-example

:私たちは、コマンドがエントリポイントに渡された参照sh -c 'ls $MY_VAR'が、$MY_VAR 実際に解決されません。

2) docker inspect CONTAINER

alpine-exampleコンテナを検査すると:

docker inspect alpine-example | grep -4 Cmd

コマンドもそこにありますが、env変数の値はまだ表示されていません。

        "Cmd": [
            "sh",
            "-c",
            "ls $MY_VAR"
        ],

実際、これらのdockerコマンドでは補間された変数を確認できませんでした。
トレードオフとして、docker inspectを使用して、コンテナーのコマンド変数と環境変数の両方を個別に表示できます。

docker inspect  alpine-example  | grep -4 -E "Cmd|Env"

それは印刷します:

        "Env": [
            "MY_VAR=/var",
            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
        ],
        "Cmd": [
            "sh",
            "-c",
            "ls $MY_VAR"
        ]

よりドッカーな方法は、レンダリングするJSON属性を指定できる--formatフラグを使用docker inspectすることです。

docker inspect --format '{{.Name}} {{.Config.Cmd}}  {{ (.Config.Env) }}'  alpine-example

その出力:

/ alpine-example [sh -c ls $ MY_VAR] [MY_VAR = / var PATH = / usr / local / sbin:/ usr / local / bin:/ usr / sbin:/ usr / bin:/ sbin:/ bin]

3)実行中のコンテナーのコンテナー自体から開始されたプロセスを取得します

Dockerによって実行されるエントリポイントとコマンドは役立つかもしれませんが.sh、実際の/コアプロセスの開始を担当するラッパーエントリポイントスクリプト()のみであるため、不十分な場合があります。
たとえば、Nexusコンテナを実行すると、コンテナを実行するために実行および表示されるコマンドは"sh -c ${SONATYPE_DIR}/start-nexus-repository-manager.sh"です。
それはPostgreSQLの場合です"docker-entrypoint.sh postgres"

詳細情報を取得するには、実行中のコンテナで実行し docker exec CONTAINER ps auxます。
それは私たちに興味がないかもしれない他のプロセスを印刷するかもしれません。
エントリポイントによって起動された初期プロセスに絞り込むために、次のことを行うことができます。

docker exec CONTAINER ps -1

1エントリポイントによって実行されるプロセスは通常、1IDを持つプロセスであるため、ここで指定します。

がなくてもps/proc/1/cmdline(ほとんどのLinuxディストリビューションではなくすべての)で情報を見つけることができました。例えば ​​:

docker exec CONTAINER cat /proc/1/cmdline | sed -e "s/\x00/ /g"; echo    

コンテナーを起動ps -PIDしたDocker ホストにアクセスできる場合、エントリポイントによって実行されるプロセスの完全なコマンドを取得する別の方法は、次のとおりです。

ps -$(docker container inspect --format '{{.State.Pid}}'  CONTAINER)

docker psによるユーザーフレンドリーなフォーマット

docker ps --no-trunc常に読みやすいとは限りません。
印刷する列を表形式で指定すると、改善される場合があります。

docker ps   --no-trunc  --format "table{{.Names}}\t{{.CreatedAt}}\t{{.Command}}"

エイリアスを作成すると役立つ場合があります。

alias dps='docker ps   --no-trunc  --format "table{{.Names}}\t{{.CreatedAt}}\t{{.Command}}"'

2

Dylanのコメントを本格的な回答に変えると、あまりにも便利すぎるため、

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER

それは何をするためのものか?コンテナー内でhttps://github.com/lavie/runlikeを実行し、完全なdocker runコマンドを取得して、コンテナーを削除します。

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