📖

Dockerイメージをbuildする際、イメージが更新されない問題を解消する

2023/08/30に公開

はじめに

初めまして。
都内IT企業で、データアルゴリズムチームのエンジニアをしております、Noraです。

Dockerイメージのbuild / push周りでハマったので、知見を共有させていただきます。

起きた事象

Dockerイメージ内のスクリプトを修正して、buildし直したが、修正した変更がコンテナに反映されていない。

$ echo docker build
$ docker buildx build --platform=linux/amd64 -t ${IMAGE_NAME} --build-arg PREFIX=${PREFIX} -f ${DOCKERFILE_PATH} .

原因

docker build時に、キャッシュが利用されていることが原因で、修正が反映されませんでした。

キャッシュが利用されている場合、docker buildしても、以下のような表示がターミナル上に出てきました。

fd5aa641b308: Layer already exists
d9c60c6f98e8: Layer already exists
d9d14867f6d7: Layer already exists
64ce166099ca: Layer already exists
73b670e35c69: Layer already exists
5f70bf18a086: Layer already exists
9ea142d097a5: Layer already exists
52f5845b1de0: Layer already exists
e7fadb3ab9d4: Layer already exists

Dockerのキャッシュについては、以下の記事で解説してくださっている、masibwさんという方が、いらっしゃいますので、ご参照ください。

DockerはDockerfileに書かれた内容を解釈してイメージを作ってくれるわけですが、1つ1つの命令をレイヤー(層)とし、積み重ねてイメージを作成します。
レイヤーに変更がなければDockerは以前の結果を再利用してくれます(レイヤーキャッシュ)。逆に変更があれば、それ以降のレイヤーは再度作成されます。[1]

(引用失礼致しますmm)
https://zenn.dev/masibw/articles/57a47a7381b9b3

解消法

no cacheオプションを利用すると良いようです。

--no-cache #イメージの構築時にキャッシュを使用しない

次のように、スクリプトを修正することで、キャッシュを使用せず、イメージの更新がコンテナに反映されました。

+ docker buildx build --platform=linux/amd64 -t ${IMAGE_NAME} --build-arg PREFIX=${PREFIX} --no-cache -f ${DOCKERFILE_PATH} .
- docker buildx build --platform=linux/amd64 -t ${IMAGE_NAME} --build-arg PREFIX=${PREFIX} -f ${DOCKERFILE_PATH} .

※docker buildについては、公式ドキュメントを参照
https://docs.docker.jp/engine/reference/commandline/build.html

あと書き

記事をお読みいただき、ありがとうございました。
もし補足点・修正等ございましたら、ご気軽にコメントいただけますと幸いです。

引き続き、ハマったポイントや、タメになる情報を発信できればと思います。

脚注
  1. https://docs.docker.jp/engine/reference/commandline/build.html より引用 ↩︎

Discussion