docker history で途切れた項目を読みやすくする方法

## はじめに

[docker history](https://docs.docker.jp/engine/reference/commandline/history.html) コマンドを使うと、外部から提供された Docker イメージがどうやって作られたかが確認できます。ところがイメージレイヤによっては `CREATED BY` の項目が長すぎて、途切れてしまう場合があります。（イメージ名 `docker:latest` は適宜読み替えてください）

```bash
$ docker history docker:latest
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
...
<missing>           5 days ago          /bin/sh -c #(nop)  ENTRYPOINT ["docker-entry… #途切れている
...
```

そこで、次のオプションをつけることで途切れずかつ読みやすく表示することができます。

## 実行結果

```bash
$ docker history --no-trunc --format "{{json .}}" docker:latest
...
{
  "Comment": "",
  "CreatedAt": "2022-03-11T09:19:42+09:00",
  "CreatedBy": "/bin/sh -c #(nop)  ENTRYPOINT [\"docker-entrypoint.sh\"]", #途切れなくなった
  "CreatedSince": "5 days ago",
  "ID": "<missing>",
  "Size": "0B"
}
...
```

## 調べたことメモ

まずは [docker history](https://docs.docker.jp/engine/reference/commandline/history.html) から `--no-trunc` オプションを見つけて試しました。確かに `CREATED BY` は途切れなくはなりましたが、最長の `CREATED BY` に合わせて表示が間延びされて読みにくくなってしまいます。

```bash
$ docker history --no-trunc docker:latest
IMAGE                                                                     CREATED             CREATED BY                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         SIZE                COMMENT
...
<missing>                                                                 5 days ago          /bin/sh -c #(nop)  ENTRYPOINT ["docker-entrypoint.sh"]                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             0B
...
```

次に [docker history (本家）](https://docs.docker.com/engine/reference/commandline/history/) から `--format` オプションが使えそうだと気付きました。

```bash
$ docker history --no-trunc --format "{{.CreatedBy}}" docker:latest
...
/bin/sh -c #(nop)  ENTRYPOINT ["docker-entrypoint.sh"]
...
```

ヘッダーが表示されないことでレイアウトが崩れることもなくなり、当初の目的は達成できました。その後 [format コマンドとログ出力](https://docs.docker.jp/config/formatting.html) を読み進めると、

> どのようなデータを表示可能かどうか調べるためには、全ての内容を json として表示します。

とあり、様々なログ表示を加工できることがわかりました。例えば JSON フォーマットですべて表示する場合は次のようにします。

```bash
$ docker history --no-trunc --format "{{json .}}"  docker:latest | jq .
```

ここから先の更なるログ表示の加工は [jq](https://stedolan.github.io/jq/) 側で良い感じにできますね。