docker image pruneで「何日前より前のイメージを全て削除」を指定する

Dockerイメージを作ってAmazon ECSにプッシュ、を繰り返していた。その結果、docker imagesコマンドを打つと、使っていない(最新でない)dockerイメージが大量に表示されてわかりにくくなってしまった。イメージを削除する方法を調べた。

Q1. Docker image を多数一斉に消すためのコマンドは何か?

A1. docker image prune

ドキュメントはこちら。
https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/image_prune/
…… docker.com のドメインの下に無いんだけど、これって公式なのか? 個人的な翻訳なのか? 分からん。
https://docs.docker.jp/engine/reference/commandline/image_prune.html
ドメインにdockerが入っているのはこっちですね。

docker image rm もイメージを削除するコマンドだが、イメージのidを指定する必要があるので、一定条件に当てはまるイメージをまとめて削除はできない。

Q2. デフォルトだとどの範囲が消えるの?

A2. 宙ぶらりんなイメージ = 「タグを持たず、他のコンテナからも参照されないイメージ」

全ての宙ぶらりんな(dangling)イメージを削除します。(先ほどのドキュメントより)
って言われても分からないな。別のページの説明によれば「タグを持たず、他のコンテナからも参照されないイメージ」のこと。

宙ぶらりんイメージとは、タグを持たず、他のコンテナからも参照されないイメージです。
https://docs.docker.jp/config/pruning.html

Q3 untilの使い方は?

A3. ある時点より手前の宙ぶらりんなイメージを全部削除する。

以下2つの方式が可能。

  • 具体的なタイムスタンプを指定して「until=2017-01-04T00:00:00」とするか、
  • 現在からの相対時間で「until=240h」とするか

Q4 3日前よりも前に作られた宙ぶらりんな(dangling)imageを全部消したい。どのようにコマンドを打てばよいか?

A4. until=3d も until=3D も不可。until=72hとする必要あり。

3日は3dで行けるのかなーとやってみたら、

> docker image prune --filter until=3d
WARNING! (省略。yを入力して実行する)
Error response from daemon: failed to parse as time or duration: "3d"

とエラーになったので、「3日を指定する方法ってどうするんだろう」と思ってドキュメントを見ると、こう書いてあった。

デーモンが動作しているマシン上の時刻からの相対時間を、 Go duration 文字列(例: 10m 、 1h3-m )で計算します。 https://docs.docker.jp/engine/reference/commandline/image_prune.html

じゃあこの書式を調べようと思って「Go duration 文字列」で検索しても、情報が出てこない。「Go duration」で調べると出てくる。
https://leben.mobi/go/time/go-programming/#timeDuration
Go言語でtimeパッケージのtime.Duration型は、2つの時刻の差を表す型である。pythonだとdatetime.timedeltaに相当するものだな。
そしてその単位は最大で"h(時間)"までしか対応していない。

Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h".
https://pkg.go.dev/time#Duration

というわけで3日をそのまま指定することはできない。72時間に単位換算して、

> docker image prune --filter until=72h

とするのが正解だ。

慣れないDockerを使い始めた初心者の覚え書きでした。それでは。