ビルドキャッシュの活用
Dockerのビルドキャッシュ機構を理解して効果的に利用し、Dockerのビルド時間を最適化します。
「ビルドキャッシュの活用」はCoddyKit上の無料DevOps Bootcampレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはDevOps Bootcamp学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 DevOps Bootcampコースには全4レッスンが含まれています。
キャッシュで高速化
Dockerイメージのビルドには時間がかかることがあります。特に複雑なアプリケーションではその傾向が顕著です。Dockerのビルドキャッシュは、処理を大幅に高速化する便利な機能です。
以前のビルドで作成したレイヤーを再利用するため、毎回すべてを最初からビルドし直す必要がありません。

レイヤーごとのビルド
Dockerfileを使用してDockerイメージをビルドすると、Dockerは各命令を1行ずつ実行します。
FROM、RUN、COPYなどの各命令によって、イメージに新しい「レイヤー」が作成されます。- これらのレイヤーが積み重なって、最終的なイメージが形成されます。
Dockerのキャッシュチェック
Dockerは命令を実行する前に、まったく同じレイヤーを以前にビルドしていないか確認します。次の内容を比較します。
- 命令そのもの(例:
RUN apt update)。 - 特定の命令に対する「コンテキスト」(例:
COPYされるファイル)。
一致するレイヤーが見つかると、Dockerは命令を再実行せず、キャッシュからそのレイヤーを再利用します。
キャッシュの無効化
キャッシュは便利ですが、常に使用されるとは限りません。Dockerが命令またはそのコンテキストに変更を検出すると、そのレイヤーと、それ以降のすべてのレイヤーのキャッシュが無効になります。
つまり、その時点から後の部分が再ビルドされ、それより下にあるキャッシュ済みのレイヤーは無視されます。
命令を適切な順序で配置する
キャッシュヒットを最大限に活用するには、変更される可能性が低い命令から高い命令の順にDockerfileの命令を並べます。
- 安定した依存関係を先に配置: 変更頻度の低いシステムパッケージやアプリケーションの依存関係をインストールします。
- アプリケーションコードを最後に配置: 変更頻度の高いアプリケーションのソースコードは、できるだけ後でコピーします。
キャッシュヒットのための順序付け
例を見てみましょう。通常は変更頻度が低いRUN pip installコマンドを、コードを更新するたびに変わるCOPY . .より前に配置すると、Dockerは依存関係のレイヤーを再利用できます。
requirements.txtにflaskとgunicornが記載され、app.pyがメインアプリケーションだとします。
Dockerfile:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
CMD ["python", "app.py"]app.pyだけが変更された場合、Dockerが再ビルドするのは最後のCOPYレイヤーとCMDレイヤーだけなので、時間を短縮できます。
.dockerignoreで必要なファイルだけをコピー
COPY . .を使用すると、Dockerはビルドコンテキスト内のすべてのファイルに変更がないか確認します。.gitフォルダーやローカルのテストデータなど、わずかな重要でないファイルでもキャッシュが無効になる可能性があります。
.dockerignoreファイルを使用して、不要なファイルやディレクトリをビルドコンテキストから除外します。これにより、それらがキャッシュを無効にするのを防げます。
.dockerignoreの実践
ビルドコンテキストのルート(Dockerfileと同じ場所)に、.dockerignoreという名前のファイルを配置します。
.dockerignoreの例:
.git
.venv
__pycache__
*.log
node_modulesこれでCOPY . .を実行しても、Dockerはこれらのファイルを無視するため、キャッシュヒットがより安定します。
キャッシュを使わない場合
すべてをキャッシュなしで新しくビルドしたい場合もあります。デバッグや、依存関係を確実に最新バージョンにする場合に便利です。
ビルドコマンドに--no-cacheフラグを追加すると、キャッシュを使わずにDockerを強制的に再ビルドできます。
docker build --no-cache -t my-app:latest .キャッシュ最適化チェック
Node.jsアプリケーション用のDockerイメージをビルドしています。現在のDockerfileは次のとおりです。
FROM node:16-alpine
WORKDIR /app
COPY . .
RUN npm install
CMD ["npm", "start"]ビルドキャッシュを最適化するには、どの変更が最も効果的でしょうか。
まとめ: キャッシュを使いこなす
よくできました。Dockerのビルドキャッシュを活用して、イメージのビルドを高速化する方法を学びました。
- Dockerはイメージをレイヤーごとにビルドし、可能な場合はキャッシュ済みのレイヤーを再利用します。
- 命令またはそのコンテキストに変更があると、その時点以降のキャッシュが無効になります。
- 変更される可能性が低い命令から高い命令の順に並べて最適化します。
.dockerignoreを使用して、重要でないファイルをビルドコンテキストから除外します。- 必要に応じて
--no-cacheを使用し、キャッシュなしで新しくビルドします。
効率的なキャッシュによって、開発サイクルが短縮され、より柔軟なデプロイが可能になります。
よくある質問
「ビルドキャッシュの活用」レッスンは無料ですか?
はい。「ビルドキャッシュの活用」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、DevOps Bootcampコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 DevOps Bootcampコースには全4レッスンが含まれています。
「ビルドキャッシュの活用」で何を学びますか?
Dockerのビルドキャッシュ機構を理解して効果的に利用し、Dockerのビルド時間を最適化します。 ブラウザで直接実行するハンズオンコードでDevOps Bootcampを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
DevOps Bootcampを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのDevOps Bootcampは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「ビルドキャッシュの活用」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このDevOps Bootcampレッスンでコードを書いて実行できますか?
はい。すべてのDevOps Bootcampレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。