TL-DR
docker ps --no-trunc
docker inspect CONTAINER
渡されたコマンドに沿って、コンテナーを開始するために実行されたエントリーポイントを提供し${ANY_VAR}
ますが、コンテナー環境変数が解決されたものとして出力されないなど、一部のパーツが欠落する場合があります。
これを克服するにdocker inspect CONTAINER
は、env変数とコンテナーで定義されたそれらの値をConfig.Env
プロパティから個別に取得できるため、利点があります。
docker ps
docker 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
エントリポイントによって実行されるプロセスは通常、1
IDを持つプロセスであるため、ここで指定します。
がなくても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}}"'