Skip to content

Instantly share code, notes, and snippets.

@denvernine
Last active April 23, 2024 11:37
Show Gist options
  • Save denvernine/b881fb4f0f829960e5618cbe063a500b to your computer and use it in GitHub Desktop.
Save denvernine/b881fb4f0f829960e5618cbe063a500b to your computer and use it in GitHub Desktop.
dockerコマンドの出力フォーマットをカスタマイズしたい!

dockerコマンドの出力フォーマットをカスタマイズしたい!

Docker、つかってますか? 今どきはつかっていない人のほうが少ないでしょうね。

では、 docker COMMAND --format で出力を自分好みに変更している人はどれだけいるでしょうか?「この情報が表示されたらいいのになぁ」「ここの部分がもうちょっと見やすくならないかなぁ」そう思いながらつかっている人もいるんじゃないでしょうか。

--format

dockerコマンドは、ほとんどの場合 --format オプションで出力フォーマットを変更することができます。渡せる値は Go言語のtemplateに渡せるものと同じになっている ようです。いくつか例を取りながら見てみましょう。

docker images

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 ps

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

単に .IDslice に渡すだけだと以下のようなエラーが出ますので、 with を使って変数におとしています。

failed to execute template: template: :1:2: executing "" at <slice .ID 0 7>: error calling slice: index out of range: 7

docker compose ps

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}} とすることでインデックス番号は取得できますが、 lastsub などがつかえないため、その後 {{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, 

としてしまえば、とりあえずのところは「壊れたヘッダー」を見なくて済みます。

references

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment