事象
aptパッケージをDockerfileに追加してビルドするとエラーが出た
RUN apt-get update
RUN apt-get install -y build-essential ~~some_packeges~~ vim ← vimを追加した
E: Failed to fetch http://deb.debian.org/debian-security/pool/updates/main/libk/libksba/libksba8_1.3.5-2+deb10u1_amd64.deb 404 Not Found [IP: 151.101.110.132 80]
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
以下から探してみると確かに存在しない
http://security.debian.org/debian-security/
エラーメッセージによるとapt-get update
するか--fix-missing
オプションをつければいいらしい
が、Dockerfileではすでにapt-get update
している
原因
apt-get update
の結果がキャッシュされていたため、すでに存在しない古いパッケージをインストールしようとしていたのが原因
Step 3/32 : RUN apt-get update
---> Using cache
今まではインストールするパッケージ一覧に変更がなかったため、apt-get install
においてもキャッシュを使っていたので問題にならなかったが、今回はvimを追加したため、Dockerがキャッシュを使わずにインストールしようとする
にも関わらず、apt-get update
の結果は引き続きキャッシュを使うので、古いパッケージを探しにいった結果当該パッケージが見つからずにエラーになったようだ
解決
apt-get update
とapt-get install
を同一のRUN
で行うようにDockerfileを以下のように修正
RUN apt-get update \
&& apt-get install -y build-essential ~~some_packeges~~ vim
これでapt-get install
の内容に変更があるとapt-get update
もキャッシュを破棄して実行するようになる
毎回キャッシュを破棄するとビルド時間が悪化するので、変更があったときだけキャッシュを破棄するようにした
Dockerイメージのビルドキャッシュの効率的利用や軽量化、高速化については突き詰めだすと際限がないので、最終的なイメージサイズ、ビルド時間が許容範囲であれば、属人化しないように可読性を優先すべきだと思うこの頃です