--cache-from と --cache-to でビルドキャッシュを管理する
このステップでは、--cache-from
と --cache-to
フラグを使用して Docker ビルドキャッシュを管理する方法を学びます。ビルドキャッシュを使用すると、以前のビルドからレイヤーを再利用することで、後続のビルドを大幅に高速化できます。--cache-from
はキャッシュソースとして使用するイメージを指定でき、--cache-to
はビルドキャッシュをレジストリやローカルディレクトリなどの指定場所にエクスポートできます。
まず、~/project
ディレクトリにいることを確認してください。
cd ~/project
キャッシュが通常破棄される変更をシミュレートするため、Dockerfile
を少し変更しましょう。シンプルな RUN
命令を追加します。
nano
で Dockerfile
を開きます:
nano Dockerfile
builder
ステージの ARG
命令の後に以下の行を追加します:
RUN echo "Adding a new layer"
更新後の Dockerfile
は以下のようになります:
## Stage 1: Builder stage
FROM ubuntu:latest as builder
ARG GREETING="Hello from build argument!"
RUN echo "Adding a new layer"
RUN echo $GREETING > /app/greeting.txt
## Stage 2: Final stage
FROM ubuntu:latest
COPY --from=builder /app/greeting.txt /greeting.txt
CMD ["cat", "/greeting.txt"]
Dockerfile
を保存して nano
を終了します。
特定のキャッシュオプションを使用せずにイメージを再度ビルドしましょう。Docker は利用可能な場合、自動的にローカルキャッシュを使用します。
docker build -t my-cached-image .
新しい命令を追加したため、一部のレイヤーが最初からビルドされることが確認できます。これにより後続の命令のキャッシュが無効化されます。
次に、レジストリや別のビルドから以前にビルドしたイメージをキャッシュソースとして使用するシナリオをシミュレートします。デモンストレーションのため、先ほどビルドした my-cached-image
を新しいビルドのキャッシュソースとして使用します。
まず、Dockerfile
を再度少し変更して別の変更をシミュレートします。
Dockerfile
を開きます:
nano Dockerfile
新しい RUN
命令のメッセージを変更します:
RUN echo "Adding another new layer"
更新後の Dockerfile
は以下のようになります:
## Stage 1: Builder stage
FROM ubuntu:latest as builder
ARG GREETING="Hello from build argument!"
RUN echo "Adding another new layer"
RUN echo $GREETING > /app/greeting.txt
## Stage 2: Final stage
FROM ubuntu:latest
COPY --from=builder /app/greeting.txt /greeting.txt
CMD ["cat", "/greeting.txt"]
nano
を保存して終了します。
--cache-from
フラグを使用して my-cached-image
をキャッシュソースとして指定し、イメージを再度ビルドします。
docker build --cache-from my-cached-image -t my-cached-image-from .
Docker が my-cached-image
からレイヤーを使用しようとするのが確認できます。最初の RUN
命令に対応するレイヤーは命令が変更されたため再ビルドされますが、一致する場合、後続のレイヤーはキャッシュからプルされる可能性があります。
--cache-to
フラグはビルドキャッシュをエクスポートするために使用されます。これは CI/CD パイプラインでビルド間でキャッシュを共有する場合に特に便利です。--cache-to
を使用するには、通常 docker-container
ドライバーのようなキャッシュエクスポートをサポートするビルドドライバーが必要です。
まず、buildx とよく一緒に使用される Docker Compose をインストールします。
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
buildx ビルダーインスタンスを作成します。
docker buildx create --use
イメージをビルドし、キャッシュをローカルディレクトリにエクスポートします。local
キャッシュエクスポーターを使用します。
docker buildx build --cache-to type=local,dest=./build-cache -t my-exported-cache-image . --load
docker buildx build
: buildx ツールを使用してビルドします
--cache-to type=local,dest=./build-cache
: カレントディレクトリの build-cache
という名前のローカルディレクトリにキャッシュをエクスポートします
-t my-exported-cache-image
: 結果のイメージにタグを付けます
.
: ビルドコンテキスト(カレントディレクトリ)を指定します
--load
: ビルドしたイメージをローカルの Docker イメージキャッシュにロードします
ビルドとキャッシュエクスポートを示す出力が表示されます。~/project
ディレクトリに build-cache
ディレクトリが作成されます。
クリーンなビルド環境をシミュレートし、エクスポートされたキャッシュを使用してビルドしてみましょう。まず、ビルドしたイメージを削除します。
docker rmi my-cached-image my-cached-image-from my-exported-cache-image
エクスポートされたキャッシュをソースとして使用して、再度イメージをビルドします。
docker buildx build --cache-from type=local,src=./build-cache -t my-imported-cache-image . --load
--cache-from type=local,src=./build-cache
: ローカルディレクトリ build-cache
からキャッシュをインポートします
Docker がエクスポートされたキャッシュからレイヤーを使用し、最初からビルドする場合と比較してビルドプロセスが大幅に高速化されることが確認できます。