📖
Dockerイメージをbuildする際、イメージが更新されない問題を解消する
はじめに
初めまして。
都内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)
解消法
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については、公式ドキュメントを参照
あと書き
記事をお読みいただき、ありがとうございました。
もし補足点・修正等ございましたら、ご気軽にコメントいただけますと幸いです。
引き続き、ハマったポイントや、タメになる情報を発信できればと思います。
Discussion