Dockerfile を変更したときに再ビルドが必要になるケースを整理する
Dockerfile 本体や COPY / ADD で取り込むファイルを変更したときに、Docker イメージの再ビルドが必要になる理由を整理する
今日やったこと
- Dockerfile を変更したときに、Docker イメージの再ビルドが必要になるケースを整理した
- Dockerfile の中で
COPYやADDしているファイルを変更した場合も、再ビルドが必要になることを確認した - コンテナを再起動するだけでは、イメージの内容は更新されないことを確認した
- Dockerfile の各命令がレイヤーとしてキャッシュされることを意識して、どの変更がビルド結果に影響するかを整理した
学んだこと
- Dockerfile は、Docker イメージを作成するための手順書のようなもの
- Dockerfile を変更しただけでは、既存の Docker イメージやコンテナには反映されない
- Dockerfile の変更内容を反映するには、
docker buildでイメージを再ビルドする必要がある - Dockerfile の中で
COPYやADDしているファイルを変更した場合も、ビルド結果が変わるため再ビルドが必要になる - たとえば、以下のような Dockerfile がある場合、
requirements.txtを変更したら再ビルドが必要になる
COPY requirements.txt .
RUN pip install -r requirements.txt
- また、アプリケーション本体を
COPYしている場合は、そのソースコードを変更したときも再ビルドが必要になる
COPY ./app /app
- 一方で、コンテナ起動時にボリュームマウントしているファイルを変更しただけであれば、必ずしもイメージの再ビルドは必要ない
- 再ビルドが必要かどうかは、「その変更が Docker イメージの中に取り込まれるものか」で判断すると分かりやすい
あいまいなこと
- Docker のビルドキャッシュがどのタイミングで使われるのか
COPYするファイルの変更によって、どのレイヤー以降が再実行されるのか--no-cacheを付けてビルドすべきケースと、通常のキャッシュ付きビルドでよいケースの違い
次にやること
- Docker のビルドキャッシュの仕組みを整理する
docker build --no-cacheを使うべきケースを整理する- Dockerfile の命令順によってビルド時間が変わる理由を整理する