Docker、つかってますか? 今どきはつかっていない人のほうが少ないでしょうね。
では、 docker COMMAND --format
で出力を自分好みに変更している人はどれだけいるでしょうか?「この情報が表示されたらいいのになぁ」「ここの部分がもうちょっと見やすくならないかなぁ」そう思いながらつかっている人もいるんじゃないでしょうか。
dockerコマンドは、ほとんどの場合 --format
オプションで出力フォーマットを変更することができます。渡せる値は Go言語のtemplateに渡せるものと同じになっている ようです。いくつか例を取りながら見てみましょう。
docker v25.0.1のデフォルトの出力は以下のようになっています。
docker images
# REPOSITORY TAG IMAGE ID CREATED SIZE
# nginx 1.24 6c0218f16876 12 months ago 142MB
dockerイメージの利用時はリポジトリとタグを同時に指定することが多いですし、ここはまとめて表示したいです。また、 docker ps
はIDが先にくるので、表示を合わせるために順番も入れ替えてみましょう。
docker images --format 'table {{.ID}}\t{{.Repository}}:{{.Tag}}\t{{.CreatedSince}}\t{{.Size}}'
# IMAGE ID REPOSITORY:TAG CREATED SIZE
# 6c0218f16876 nginx:1.24 12 months ago 142MB
dockerを使う上で、コンテナの一覧は最もよく見るもののひとつです。場合によって見たい情報は異なるでしょうから、ここも出し分けをしてみましょう。
docker v25.0.1のデフォルトの出力は以下のようになっています。
docker ps
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 125e9df2b500 nginx:1.24 "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 80/tcp friendly_easley
gitにならってIDを7文字に、COMMANDとCREATEDを非表示にして、NAMESを前に持ってきましょう。
docker ps --format 'table {{with $id:=.ID}}{{slice $id 0 7}}{{end}}\t{{.Image}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}'
# CONTAIN IMAGE NAMES STATUS PORTS
# 125e9df nginx:1.24 friendly_easley Up 26 minutes 80/tcp
単に .ID
を slice
に渡すだけだと以下のようなエラーが出ますので、 with
を使って変数におとしています。
failed to execute template: template: :1:2: executing "" at <slice .ID 0 7>: error calling slice: index out of range: 7
docker compose
でも同様に、 --format
オプションを渡せます。
compose v2.24.2のデフォルトの出力は以下のようになっています。
docker compose ps
# NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
# nginx-nginx-1 nginx:1.24 "/bin/sh -c 'echo '<…" nginx 26 seconds ago Up 25 seconds 0.0.0.0:32786->80/tcp, :::32786->80/tcp
docker compose
をつかっている場合、コンテナ名よりもyamlで指定したサービス名を知りたいことのほうが多いでしょうから、SERVICEを先頭に持ってきてNAMEは消してしまいましょう。
私はポートの衝突をさけるためにホスト側のポートを指定しないことが多いので、どのポート番号にマッピングされているかは知りたいのですが、コンテナ側のポート番号は自分が指定しているのでなくても問題ありません。表示の仕方を変えてしまいましょう。
また、どのコンテナが起動しているかわかればいいので、STATUSの代わりにSTATEを表示します。
docker compose ps --format 'table {{.Service}}\t{{.Image}}\t{{.State}}\t{{.Networks}}\t{{range .Publishers}}{{.URL}}:{{.PublishedPort}}, {{end}}'
# SERVICE IMAGE STATE <no value>
# nginx nginx:1.24 running nginx_default 0.0.0.0:32786, :::32786,
このカスタマイズの難点は、ヘッダー行が壊れることです。どうもヘッダー行はカラム名などから生成されるようなのですが、 .Networks
は対応していないようです。また range
に関しても、最後の要素だけを判定する方法がなく、最後の要素だけはカンマを付けないといったことができないようです。
一応 {{range $index,$element:=.Publishers}}...{{end}}
とすることでインデックス番号は取得できますが、 last
や sub
などがつかえないため、その後 {{if eq ...}}
などとして比較することができませんでした。このあたり詳しい方がいれば教えていただきたいところです。
どうしても気になる場合の手っ取り早い解決策としては、いっそのことテーブル形式を捨てるというものがあります。たとえば、
docker compose ps --format '\tService\tImage\tState\tNetwork\tPorts\n\t{{.Service}}\t{{.Image}}\t{{.State}}\t{{.Networks}}\t{{range .Publishers}}{{.URL}}:{{.PublishedPort}}, {{end}}\n'
# Service Image State Network Ports
# laravel composer:2 running ecs-nginx-laravel_default 0.0.0.0:32788, :::32788,
#
# Service Image State Network Ports
# nginx nginx:1.24 running ecs-nginx-laravel_default 0.0.0.0:32787, :::32787,
や
docker compose ps --format '\t{{.Service}}\t{{.Image}}\t{{.State}}\t{{.Networks}}\t{{range .Publishers}}{{.URL}}:{{.PublishedPort}}, {{end}}'
# laravel composer:2 running ecs-nginx-laravel_default 0.0.0.0:32788, :::32788,
# nginx nginx:1.24 running ecs-nginx-laravel_default 0.0.0.0:32787, :::32787,
としてしまえば、とりあえずのところは「壊れたヘッダー」を見なくて済みます。