2023-02-07 2023-03-27Docker
はじめに docker ps
コマンドで現在稼働中の Docker コンテナを確認できます。
デフォルトでは以下のような情報が出力されます。
ここでは 2 つのコンテナが実行されています。
CONTAINER ID
や IMAGE
の情報を取り出して、パイプで別の処理に引き渡したい(例えば、実行中プロセスをすべて停止したい)場合は、 cut
や awk
を使って処理する方法が考えられます。
ヘッダーの除去するための tail
や、 任意の列だけを取り出すための cut
、 awk
を使わずに --format
オプションを使用する方法があります。また--format
オプションには少し変わった使い方もあります。
検証環境 --format
オプションを使って出力形式を制御するdocker ps
コマンドを --format
オプション付きで実行することで、任意の情報のみを出力するように制御できます。
--format
オプションは引数指定が必須であり、引数は Go 言語テンプレート に従った記法で指定します。
Go 言語テンプレートについては こちら に記載がありました。
PHP の Smarty や Java の Velocity のようなテンプレートエンジンには変数の埋め込みが可能ですが、 Go 言語テンプレートでは {{.VARIABLE}}
の形式で変数を埋め込めます。
コンテナ ID だけを出力 --foramt
を使って、コンテナ ID だけを出力してみます。
パイプで別のコマンドに情報を引き渡しやすく、ヘッダー情報が表示されません。
docker
コマンドでは、コンテナ ID を表す組み込み変数は ID
です。
Go 言語テンプレートの形式に乗っ取り、 {{ .ID }}
の形式で埋め込みます。
テンプレートエンジンの仕組みを利用しているので、前後の文字列リテラルを埋め込むことも可能です。
コンテナ ID とイメージ ID を出力 コンテナ ID とイメージ ID を出力してみます。
コンテナ名 とイメージ ID をヘッダー付きで出力 ヘッダーも出力したい場合には、 --format
の前に table
というキーワードを記述します。
カラムの間には任意の文字列を入れて区切りましょう。
if 文を使う go 言語テンプレートの仕様に則っているので、 if 文も使用できます。
--format
オプション内で使える組み込み変数ここまでの例では、 --format
オプション内で {{ .ID }}
、 {{ .Image }}
、 {{ .Names }}
という変数を使いました。
他にも利用できる変数があります。
利用可能な変数の一覧は以下のページから確認できます。
JSON フォーマットで出力 すべての情報を JSON 形式で出力することもできます。--format
で利用可能な変数を確認するためにも利用できます。
見にくいので、 jq
コマンドをセットで使うことをおすすめします。
$ docker ps --format '{{json .}}'
{ "Command" : "\" /bin/bash\" " ,"CreatedAt" : "2023-02-07 08:50:06 +0900 JST" ,"ID" : "6965cb418c29" ,"Image" : "genzouw/ubuntu-sandbox" ,"Labels" : "desktop.docker.io/binds/0/Target=/workdir,maintainer=genzouw \u003c genzouw@gmail.com\u003e ,desktop.docker.io/binds/0/Source=/Users/genzouw/work,desktop.docker.io/binds/0/SourceKind=hostFile" ,"LocalVolumes" : "0" ,"Mounts" : "/host_mnt/User…" ,"Names" : "charming_cannon" ,"Networks" : "bridge" ,"Ports" : "" ,"RunningFor" : "48 minutes ago" ,"Size" : "0B (virtual 1.44GB)" ,"State" : "running" ,"Status" : "Up 48 minutes" }
{ "Command" : "\" /bin/bash\" " ,"CreatedAt" : "2023-02-07 08:50:03 +0900 JST" ,"ID" : "7ff433dc6fb0" ,"Image" : "genzouw/ubuntu-sandbox" ,"Labels" : "desktop.docker.io/binds/0/Source=/Users/genzouw/work,desktop.docker.io/binds/0/SourceKind=hostFile,desktop.docker.io/binds/0/Target=/workdir,maintainer=genzouw \u003c genzouw@gmail.com\u003e " ,"LocalVolumes" : "0" ,"Mounts" : "/host_mnt/User…" ,"Names" : "relaxed_goldberg" ,"Networks" : "bridge" ,"Ports" : "" ,"RunningFor" : "48 minutes ago" ,"Size" : "0B (virtual 1.44GB)" ,"State" : "running" ,"Status" : "Up 48 minutes" }
$ docker ps --format '{{json .}}' | jq .
{
"Command" : "\" /bin/bash\" " ,
"CreatedAt" : "2023-02-07 08:50:06 +0900 JST" ,
"ID" : "6965cb418c29" ,
"Image" : "genzouw/ubuntu-sandbox" ,
"Labels" : "desktop.docker.io/binds/0/Source=/Users/genzouw/work,desktop.docker.io/binds/0/SourceKind=hostFile,desktop.docker.io/binds/0/Target=/workdir,maintainer=genzouw <genzouw@gmail.com>" ,
"LocalVolumes" : "0" ,
"Mounts" : "/host_mnt/User…" ,
"Names" : "charming_cannon" ,
"Networks" : "bridge" ,
"Ports" : "" ,
"RunningFor" : "48 minutes ago" ,
"Size" : "0B (virtual 1.44GB)" ,
"State" : "running" ,
"Status" : "Up 48 minutes"
}
{
"Command" : "\" /bin/bash\" " ,
"CreatedAt" : "2023-02-07 08:50:03 +0900 JST" ,
"ID" : "7ff433dc6fb0" ,
"Image" : "genzouw/ubuntu-sandbox" ,
"Labels" : "maintainer=genzouw <genzouw@gmail.com>,desktop.docker.io/binds/0/Source=/Users/genzouw/work,desktop.docker.io/binds/0/SourceKind=hostFile,desktop.docker.io/binds/0/Target=/workdir" ,
"LocalVolumes" : "0" ,
"Mounts" : "/host_mnt/User…" ,
"Names" : "relaxed_goldberg" ,
"Networks" : "bridge" ,
"Ports" : "" ,
"RunningFor" : "48 minutes ago" ,
"Size" : "0B (virtual 1.44GB)" ,
"State" : "running" ,
"Status" : "Up 48 minutes"
}
docker inspect
コマンドでも使える--format
オプションは docker ps
以外でも利用できます。docker inspect
コマンドでも同様の気泡となっています。
ひとこと 便利ですが、ID だけほしいときは調べるのが面倒で docker ps -a | tail -n +2 | awk '{ print $1 }'
を実行したほうが早いです。
ディスカッション
コメント一覧
まだ、コメントがありません