docker compose upの--pullオプション、missingでもlatestタグは毎回プルされることがあるらしい

  • Docker
  • DevOps

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

docker composeで指定してるイメージを最新にする手順を確認したのでメモ。基本はシンプルだけど、--pullオプションのpolicy周りで気になる挙動があった。

基本の更新手順

やることは2つだけ。

ターミナル
docker compose pull
docker compose up -d

pullでレジストリから最新イメージを取得して、up -dで差分があれば再作成、なければそのまま維持される。既存コンテナのconfigやイメージが変わってなければ何も起きない。

固定タグ(myapp:v1.2.3)ならこの2ステップで十分。latestタグだと「いつ変わったか」が追いにくくなるので、本番運用では固定タグかdigest指定(myapp@sha256:...)の方が再現性は高い。

--pullオプションでワンコマンド化

docker compose upに--pullをつけると、起動時に自動でプルしてくれる。

ターミナル
docker compose up -d --pull always

指定できる値はalways / missing / neverの3つで、デフォルトはpolicy(compose.ymlのpull_policyフィールド、未指定ならmissing相当)。

  • always: 毎回プルする
  • missing: ローカルにイメージがなければプルする
  • never: プルしない

compose.yml側にもpull_policyを書ける。値の種類はもう少し多くて、dailyやevery_12hのような時間ベース指定もあるらしい(実機未確認)。digest固定みたいに絶対に変わらないイメージにはmissing、featureブランチのimageみたいに常に追いたいものにはalways、という使い分けが基本になりそう。

missingでもlatestタグは再プルされることがある

ここが気になったポイント。GitHubのdocker/composeのissueで、--pull missingを指定してるのにphpmyadmin:latestが既にローカルにあるにもかかわらず毎回プルを試みる、という報告があった(#12726)。

missingポリシーは「イメージが存在しなければプルする」という定義のはずだけど、latestタグの場合はcomposeが「常に最新か確認する」動作になってる可能性がある。実機で検証したわけじゃないので断定はできないけど、latestタグを使ってる環境で--pull missingを過信しない方がよさそう。

固定タグやdigest運用にしておけば、この手の「意図しない再プル」問題自体を避けられる。

ビルドしてる場合

image:じゃなくてbuild:でローカルビルドしてる場合は、そもそもpullの対象にならない。

ターミナル
docker compose build
docker compose up -d

ベースイメージまで更新したいときはdocker compose build --pullでベースイメージの再取得を強制できる。今回はここまでは試してない。

後片付け

再作成後に古いイメージが残るので、不要なら消しておく。

ターミナル
# 未使用イメージの削除(タグなしイメージ含む)
docker image prune
# 使われていないコンテナ・ネットワーク・イメージまとめて削除
docker system prune

docker system pruneは範囲が広いので、本番環境で使うときは-aつけずに一旦様子見した方が安全。