Docker4 択難易度 応用

状況

Dockerfile の RUN で https://example.com/rules/latest.json を curl で取得している。配布元を更新して再ビルドしたが中身は古いまま。ビルド出力のこの行に CACHED と出ており、ホストで同じ URL を開くと新しい内容が返る。

最も疑わしい原因は?

  1. A配布元の latest.json がまだ更新されていない
  2. B命令の文字列が前回と同じなので、キャッシュが使われた
  3. C.dockerignore で latest.json が除外されている
  4. Dベースイメージに古い latest.json が入っている

正答

  1. A
  2. B
  3. C
  4. D

解説

ビルドキャッシュは、それまでの命令がキャッシュから使われている限り、RUN 命令については命令の文字列が前回と同じかで判定し、命令が取りに行く外部の内容が変わったかは見ない。ビルド出力の CACHED は、この行を実行せず前回の層を使った印で、古い内容がそのまま残る。--no-cache で作り直すか、取得する版を ARG で渡して命令の文字列を変える。ホストからは新しい内容が取れるので、配布元(A)は更新済み。.dockerignore はビルドコンテキストから送るファイルを除くもので、ビルド中にネットから取るファイルには効かない(C)。ベースイメージに古いファイルがあっても、RUN で取得し直せば上書きされる(D)。

参考: docs.docker.com

build-cachedockerfiletroubleshooting

この問題を含む Docker のテストを制限時間つきで解く

Dockerクイズへ