Dockerfileを何回変更しても内容が更新されない事象の原因はもしかしてキャッシュかも【Docker】

Ubuntu

DockerやDocker ComposeでDockerfileを変更したのに全然内容が変わらない!というのは、Dockerを長らく使っている方なら一度はハマったことがあるはず・・・。

にもかかわらず、検索しても「Dockerfileの内容がおかしいのでは?」とか「ちゃんとapt-get updateして」みたいな記事しか出てこず、さらにハマる負のスパイラル。

恐らくそれ、キャッシュの問題なので以下を試してみてください。

実行内容

Build Cache確認

ちゃんとdocker rmiまでして、イメージも削除しているのに・・・という方、以下のコマンドを実行して、キャッシュ(Build Cache)が残っていれば、ほぼソレが原因で確定です。

docker system df

キャッシュを使わずにビルドする

キャッシュを使わずにビルドするには、以下のコマンドを打ちます。

Docker

docker build . --no-cache

Docker Compose

docker-compose build --no-cache

ビルドせずにキャッシュを削除する

ビルドせず、単にキャッシュ削除するだけならこちら。

docker builder prune

かなり強力なコマンドなので注意しながら実行してください。(他のイメージのキャッシュもすべて削除されます。)

おまけ

以下は、Docker豆知識です。

キャッシュ・バスティング(cache busting)

Dockerfile内で1行ごとにRUNを実行していると、サイズが大きくなる上に、キャッシュが蓄積されるので、毎度一からダウンロードされてしまうデメリットはありますが、以下の方法が良いと思います。

RUN apt-get update && apt-get install -y \
XXX \
YYY \
ZZZ

また、apt-get upgradeは非推奨ですので、あわせて注意してください。

Dockerイメージサイズを小さくする

RUN apt-get update && apt-get install -y \
XXX \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*

もはや本題とは関係がありませんが、こんなのもありますという紹介。

Debianパッケージファイルの削除と、apt-get updateで取得したリポジトリのパッケージリストの削除を行うことで、Dockerイメージファイルを小さくできます。

よければ使ってみてください。

【Reference】

https://docs.docker.jp/develop/develop-images/dockerfile_best-practices.html

https://dev.classmethod.jp/articles/apt-get-magic-spell-in-docker

スポンサーリンク

Ubuntu

Posted by このめ