状況
本番ホストを 1 台追加して docker compose up -d したら、既存ホストと挙動が違った。調べると、追加ホストだけ前日に push された未検証のイメージで動いていた。
再発を防ぐ直し方として最も適切なものは?
services: web: image: registry.example.com/shop/web:latest restart: always正答
- image を検証済みのダイジェスト(@sha256:…)か、不変のバージョンタグで固定する
- latest を stable というタグ名に変え、push のたびに stable も付け替える
- up -d の前に、全ホストで
docker compose pullを必ず実行してそろえる - restart: always を外し、コンテナが勝手に再起動されないようにする
解説
latest のようなタグは push のたびに付け替えられるので、pull した時期によってホストごとに中身が変わる。既存ホストは手元に以前の latest が残っていてそれを使い、追加ホストは手元に無いので新しい latest を pull した、というのがこの症状。検証したイメージをダイジェスト(image@sha256:…)か、付け替えない運用のバージョンタグで指定すれば、どのホストでも同じ中身になる。stable に名前を変えても付け替える限り同じ問題が残る。全ホストで pull するとそろうのは未検証の新しい latest のほう。restart は再起動の方針で、使うイメージとは関係しない。
参考: docs.docker.com
この問題を含む Docker のテストを制限時間つきで解く
Dockerクイズへ