Dockerイメージのタグ上書きで見えた!mirror.gcr.ioキャッシュの落とし穴
今回は、同じタグで異なるイメージ(nginx と busybox)を push したときに、mirror.gcr.io 側のキャッシュがどう動作するのかを実験しました。
実験の概要
-
Step 1: nginx のイメージを push
- docker.io から
nginx:latest
を pull -
kahiro/nginx:latest
として tag し、 push - mirror.gcr.io から pull して、digest が
sha256:2cdfd36070a281c568ef9639b00ba906210a708d8a0f3fa87f91718384a67fc4
と一致
- docker.io から
-
Step 2: busybox のイメージで上書き push
- docker.io から
busybox:latest
を pull - 同じ
kahiro/nginx:latest
タグで tag し、 push - mirror.gcr.io から pull したが、古い nginx のdigestがそのまま返却(
sha256:2cdfd36070a281c568ef9639b00ba906210a708d8a0f3fa87f91718384a67fc4
)となる
- docker.io から
何が起こったのか?
-
正常動作(Step 1)
docker.io からの nginx イメージを push すると、mirror.gcr.io も正しくキャッシュし、同じdigestを返しました。 -
キャッシュの罠(Step 2)
同一タグ(kahiro/nginx:latest
)に busybox イメージを push して上書きしたはずなのに、mirror.gcr.io 側はキャッシュが残っており、更新前の nginx のdigestを返し続けています。
まとめ
-
タグの上書きには注意!
同じタグで異なるイメージを push すると、mirror.gcr.io のキャッシュが更新されず、古いイメージの情報が残る可能性があります。 (Cacheがいつpurgeされるかは不明です -
運用のポイント
- キャッシュ更新のタイミングの確認が必須
- 異なるイメージは可能な限り別のタグを利用するなど、運用ルールの見直しが必要
今回の実験結果から、mirror.gcr.io のタグキャッシュは常に最新ではなく、タグ名の上書きによるイメージ更新がすぐには反映されないことが分かりました。これを踏まえ、今後のDockerイメージ運用時はキャッシュの挙動に十分注意してください!