今日やったこと

  • Dockerfile を変更したときに、Docker イメージの再ビルドが必要になるケースを整理した
  • Dockerfile の中で COPYADD しているファイルを変更した場合も、再ビルドが必要になることを確認した
  • コンテナを再起動するだけでは、イメージの内容は更新されないことを確認した
  • Dockerfile の各命令がレイヤーとしてキャッシュされることを意識して、どの変更がビルド結果に影響するかを整理した

学んだこと

  • Dockerfile は、Docker イメージを作成するための手順書のようなもの
  • Dockerfile を変更しただけでは、既存の Docker イメージやコンテナには反映されない
  • Dockerfile の変更内容を反映するには、docker build でイメージを再ビルドする必要がある
  • Dockerfile の中で COPYADD しているファイルを変更した場合も、ビルド結果が変わるため再ビルドが必要になる
  • たとえば、以下のような 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 の命令順によってビルド時間が変わる理由を整理する