はじめに
この実験では、docker buildx prune コマンドを使用して Docker ビルドキャッシュを効果的に管理する方法を探ります。ビルドキャッシュは、以前にビルドしたレイヤーを再利用することで Docker イメージのビルドを加速する重要なメカニズムです。しかし、時間の経過とともにこのキャッシュは蓄積され、ディスク容量を大量に消費する可能性があります。
まず、簡単な Docker イメージをビルドしてビルドキャッシュを生成します。次に、docker buildx prune を使用してこのキャッシュを整理するさまざまな方法を実演します。これには、フィルタなしですべてのキャッシュを整理する方法、--filter オプションを使用して最近のデータを保持しながら選択的に整理する方法、--keep-storage でキャッシュサイズを制限する方法、そして最後に --all フラグを使用して内部イメージを含むすべてのビルドキャッシュを整理する方法が含まれます。この実験を終える頃には、Docker ビルドキャッシュを効率的に管理する方法についてしっかりと理解できるようになるでしょう。
ビルドキャッシュを作成するイメージをビルド
このステップでは、簡単な Docker イメージを構築してビルドキャッシュを作成します。Docker ビルドキャッシュは、以前のビルドからレイヤーを再利用することでビルドプロセスを高速化するメカニズムです。Docker イメージをビルドする際、Dockerfile の各命令はレイヤーを生成します。前回のビルドから命令が変更されていない場合、Docker はそのレイヤーを再構築せずに既存のレイヤーを再利用できます。
まず、プロジェクト用のディレクトリを作成し、移動します。
mkdir ~/project/docker-cache-demo
cd ~/project/docker-cache-demo
次に、簡単な Dockerfile を作成します。この Dockerfile はファイルをイメージにコピーし、コマンドを実行します。
nano Dockerfile
以下の内容を Dockerfile に追加します:
FROM ubuntu:latest
COPY . /app
RUN echo "Hello, Docker Cache!" > /app/message.txt
CMD ["cat", "/app/message.txt"]
ファイルを保存して閉じます。
続いて、イメージにコピーする簡単なファイルを作成します。
nano message.txt
message.txt に以下の内容を追加します:
This is a test message.
ファイルを保存して閉じます。
これで、Docker イメージを構築します。イメージに cache-demo というタグを付けます。
docker build -t cache-demo .
Docker がステップごとにイメージを構築する様子が出力されます。各ステップは Dockerfile の命令に対応しています。Docker は ubuntu:latest イメージが存在しない場合にダウンロードし、message.txt ファイルをコピーし、echo コマンドを実行します。
ビルドが完了したら、利用可能なイメージをリスト表示してイメージが作成されたことを確認できます。
docker images
イメージのリストに cache-demo が表示されるはずです。
次に、Dockerfile や message.txt に変更を加えずに再度イメージを構築します。
docker build -t cache-demo .
今回は、ビルドプロセスが大幅に高速化されていることに気付くでしょう。Dockerfile の命令と message.txt の内容が変更されていないため、Docker は前回のビルドから既存のレイヤーを再利用します。出力のほとんどのステップで "Using cache" と表示されます。これが、Docker ビルドキャッシュが後続のビルドを高速化する仕組みです。
フィルタなしでビルドキャッシュを削除
このステップでは、フィルタを使用せずに Docker ビルドキャッシュを整理する方法を学びます。ビルドキャッシュの整理は、使用されていないビルドキャッシュエントリを削除することでディスクスペースを解放します。
ビルドキャッシュを整理するコマンドは docker builder prune です。デフォルトでは、このコマンドは現在存在するイメージによって使用されていないすべてのビルドキャッシュエントリを削除します。
ビルドキャッシュを整理するコマンドを実行しましょう。
docker builder prune
アクションの確認を求められます。y と入力して Enter キーを押して続行します。
WARNING! This will remove all dangling build cache.
Are you sure you want to continue? [y/N] y
出力には削除されたビルドキャッシュエントリと、回収された総容量が表示されます。
整理の効果を確認するため、再度イメージをビルドしてみましょう。
cd ~/project/docker-cache-demo
docker build -t cache-demo .
今回は、前のステップでの 2 回目のビルドよりも時間がかかる可能性があります。これは、一部またはすべてのビルドキャッシュが削除されたためです。Docker は整理されたレイヤーを再構築します。
フィルタなしでの整理は、未使用のビルドキャッシュをすべてクリーンアップしてディスクスペースを最大化したい場合に便利です。ただし、頻繁にイメージを再構築する場合、後続のビルド速度に影響を与える可能性があります。次のステップでは、どのビルドキャッシュエントリを整理するかをより細かく制御するためのフィルタの使用方法を探ります。
--filter を使用して最新データを保持しながらビルドキャッシュを削除
このステップでは、--filter フラグを使用して最近のデータを保持しながら Docker ビルドキャッシュを整理する方法を学びます。これはディスクスペースを解放したいが、最近のビルドではキャッシュの恩恵を受けたい場合に便利です。
docker builder prune コマンドは様々なフィルタをサポートしています。有用なフィルタの 1 つが until で、特定のタイムスタンプより古いビルドキャッシュエントリを削除できます。タイムスタンプは日時、または現在時刻からの期間で指定可能です。
まず、最近のビルドキャッシュがあることを確認するため、再度イメージをビルドしましょう。
cd ~/project/docker-cache-demo
docker build -t cache-demo .
次に、過去 5 分間のエントリを保持しながらビルドキャッシュを整理します。until フィルタに 5m のような期間を指定できます。
docker builder prune --filter "until=5m"
アクションの確認を求められます。y と入力して Enter キーを押して続行します。
WARNING! This will remove all dangling build cache.
Are you sure you want to continue? [y/N] y
出力には削除されたビルドキャッシュエントリが表示されます。5 分より古いエントリのみが削除されます。
特定のタイムスタンプを指定することも可能です。例えば、特定の日時より古いキャッシュエントリを削除するには "YYYY-MM-DDTHH:MM:SS" のような形式を使用します。
期間を指定した until フィルタを使用すると、古いエントリをクリーンアップしながら最新のビルドキャッシュを保持できるため、ディスクスペースの使用量とビルド速度のバランスを取るのに便利です。
--keep-storage で特定サイズを保持しながらビルドキャッシュを削除
このステップでは、--keep-storage フラグを使用して特定のストレージ容量を保持しながら Docker ビルドキャッシュを整理する方法を学びます。これはビルドキャッシュが使用するディスク容量を制限したい場合に便利です。
docker builder prune コマンドに --keep-storage フラグを指定すると、ビルドキャッシュに保持する最大ストレージ容量を設定できます。Docker は残りのキャッシュの合計サイズが指定された制限を下回るまで、最も古いビルドキャッシュエントリを削除します。
まず、複数のビルドキャッシュエントリを作成するため、イメージを数回ビルドしましょう。
cd ~/project/docker-cache-demo
docker build -t cache-demo:v1 .
docker build -t cache-demo:v2 .
次に、1GB のストレージのみを保持しながらビルドキャッシュを整理します。サイズはバイト、キロバイト (k)、メガバイト (m)、ギガバイト (g) で指定可能です。
docker builder prune --keep-storage 1g
アクションの確認を求められます。y と入力して Enter キーを押して続行します。
WARNING! This will remove all dangling build cache.
Are you sure you want to continue? [y/N] y
出力には削除されたビルドキャッシュエントリと回収された総容量が表示されます。Docker は残りのキャッシュの合計サイズが約 1GB 以下になるまで、最も古いキャッシュエントリを削除します。
--keep-storage フラグを使用すると、特にストレージ容量が限られた環境で、ビルドキャッシュが消費するディスクスペースを効果的に管理できます。
--all オプションで内部イメージを含む全ビルドキャッシュを削除
このステップでは、--all フラグを使用して内部イメージを含む全ての Docker ビルドキャッシュを整理する方法を学びます。これは最も積極的なキャッシュクリーンアップ方法で、既存イメージで使用されているかどうかに関わらず全てのキャッシュエントリを削除します。
docker builder prune コマンドに --all フラグ(短縮形は -a)を指定すると、全てのビルドキャッシュエントリが削除されます。これにはタグ付けされていない中間ビルドイメージに関連するキャッシュエントリも含まれます。
全てのビルドキャッシュを整理するコマンドを実行しましょう。
docker builder prune --all
アクションの確認を求められます。y と入力して Enter キーを押して続行します。
WARNING! This will remove all build cache.
Are you sure you want to continue? [y/N] y
出力には削除された全てのビルドキャッシュエントリと回収された総容量が表示されます。このコマンドは、--all フラグなしで整理する場合やフィルタを使用する場合と比べて、通常最も多くのディスクスペースを解放します。
このコマンド実行後、再度 cache-demo イメージをビルドすると、全てのビルドキャッシュが削除されているため、Docker は全てのレイヤーを再ビルドする必要があり、最も時間がかかる可能性があります。
cd ~/project/docker-cache-demo
docker build -t cache-demo .
docker builder prune --all は、可能な限り多くのディスクスペースを解放したい場合や、既存のキャッシュに依存せずにクリーンなビルドを行いたい場合に有用です。ただし、新しいキャッシュが生成されるまでの間、後続のビルドが大幅に遅くなることに注意してください。
まとめ
この実験では、docker buildx prune コマンドを使用して Docker ビルドキャッシュを管理する方法を学びました。まず、簡単な Docker イメージをビルドしてキャッシュを生成し、Docker が後続のビルドを高速化するためにレイヤーを再利用する仕組みを観察しました。
次に、ビルドキャッシュを整理する様々な方法を検討しました。フィルタなしで全てのビルドキャッシュを整理する方法、--filter オプションを使用して最近のキャッシュデータを保持する方法、--keep-storage でキャッシュサイズを制限する方法、そして最後に --all フラグで内部イメージを含む全てのビルドキャッシュを削除する方法を学びました。これらのテクニックは、ディスクスペースの管理やビルド環境の最適化に不可欠です。



