はじめに
この実験では、docker builder prune コマンドを使用して Docker ビルドキャッシュを効果的に管理する方法を学びます。まず、シンプルな Docker イメージをビルドして、ビルドキャッシュがどのように作成され、後続のビルドを高速化するためにどのように利用されるかを理解します。
イメージのビルド後、ビルドキャッシュをクリーンアップするさまざまな方法を探索します。これには、ダングリング (dangling) ビルドキャッシュの削除、未使用のすべてのビルドキャッシュの削除、およびフィルターを使用した選択的なキャッシュの削除が含まれます。最後に、ストレージ容量を確保しながらビルドキャッシュを削除する方法を学び、ビルドキャッシュ管理技術を包括的に理解します。
ビルドキャッシュを作成するためにイメージをビルドする
このステップでは、ビルドキャッシュがどのように作成されるかを理解するために、シンプルな Docker イメージをビルドします。Docker はビルドキャッシュを使用して、後続のビルドを高速化します。Dockerfile 内の各命令はレイヤーを作成し、前回のビルド以来命令が変更されていない場合、Docker はキャッシュから既存のレイヤーを再利用することができます。
まず、もしまだ ~/project ディレクトリにいない場合は、そのディレクトリに移動します。
cd ~/project
次に、シンプルな Dockerfile を作成しましょう。これを Dockerfile.cache と名付けます。
nano Dockerfile.cache
Dockerfile.cache ファイルに以下の内容を追加します。
FROM ubuntu:latest
RUN apt-get update && apt-get install -y --no-install-recommends curl
COPY . /app
WORKDIR /app
CMD ["curl", "https://www.example.com"]
ファイルを保存し、nano エディターを終了します(Ctrl + X を押し、次に Y を押し、最後に Enter を押します)。
この Dockerfile は以下のことを行います。
FROM ubuntu:latest: 最新の Ubuntu ベースイメージから開始します。RUN apt-get update && apt-get install -y --no-install-recommends curl: パッケージリストを更新し、curlパッケージをインストールします。これは一般的な操作であり、ベースイメージとこの命令が変更されない限り、後続のビルドでキャッシュされる可能性が高いです。COPY . /app: 現在のディレクトリの内容をイメージ内の/appディレクトリにコピーします。WORKDIR /app: 作業ディレクトリを/appに設定します。CMD ["curl", "https://www.example.com"]: このイメージからコンテナを起動したときに実行するコマンドを指定します。
ビルドする前に、ローカルに ubuntu:latest イメージがあることを確認しましょう。もしない場合、Docker はビルド中に自動的にイメージを取得しますが、最初に明示的に取得することで、ビルド出力がより明確になることがあります。
docker pull ubuntu:latest
次に、Dockerfile.cache ファイルを使用してイメージをビルドしましょう。イメージには myimage:cachetest というタグを付けます。
docker build -t myimage:cachetest -f Dockerfile.cache .
ビルドプロセスの各ステップを示す出力が表示されます。Docker は Dockerfile 内の各命令を実行します。これはこの Dockerfile を使って初めてビルドするため、Docker はこの Dockerfile で定義されたレイヤーに対してビルドキャッシュを使用しません。
ビルドが完了した後、新しく作成された myimage:cachetest を確認するために、イメージを一覧表示できます。
docker images
一覧に cachetest タグ付きの myimage が表示されるはずです。このビルドプロセスにより、Dockerfile.cache で定義された各レイヤーのビルドキャッシュが作成されました。次のステップでは、このビルドキャッシュを管理する方法を探索します。
ダングリングビルドキャッシュを削除する
このステップでは、ダングリング (dangling) ビルドキャッシュを削除する方法を学びます。ダングリングビルドキャッシュとは、名前付きのイメージに関連付けられなくなったビルドキャッシュレイヤーを指します。これは、イメージを再ビルドして、以前のレイヤーが新しいレイヤーに置き換えられた場合に発生します。ダングリングキャッシュを削除することで、ディスク容量を解放することができます。
まず、いくつかのダングリングキャッシュを作成するために、Dockerfile.cache を少し変更しましょう。RUN 命令を変更します。
もしまだ ~/project ディレクトリにいない場合は、そのディレクトリに移動します。
cd ~/project
Dockerfile.cache ファイルを編集用に開きます。
nano Dockerfile.cache
RUN 命令を以下のように変更します。
変更前:
RUN apt-get update && apt-get install -y --no-install-recommends curl
変更後:
RUN apt-get update && apt-get install -y --no-install-recommends wget
ファイルを保存し、nano エディターを終了します(Ctrl + X を押し、次に Y を押し、最後に Enter を押します)。
次に、同じタグでイメージを再ビルドしましょう。
docker build -t myimage:cachetest -f Dockerfile.cache .
出力を観察してください。Docker はおそらくキャッシュから FROM レイヤーを再利用しますが、RUN 命令が変更されているため、そのステップを再度実行し、新しいレイヤーを作成します。古い RUN 命令によって作成された前のレイヤーは、もはや myimage:cachetest イメージの一部ではないため、ダングリングビルドキャッシュになります。
ビルドキャッシュを確認するには、docker builder prune --dry-run コマンドを使用できますが、高度なツールや BuildKit の出力に対する理解がないと、ダングリングキャッシュを具体的に区別するのは必ずしも容易ではありません。より簡単な方法は、ダングリングキャッシュを削除して、解放された容量を確認することです。
ダングリングビルドキャッシュのみを削除するには、--filter dangling=true オプションを指定して docker builder prune コマンドを使用します。
docker builder prune --filter dangling=true
操作を確認するように促されます。y と入力して Enter を押します。
WARNING! This will remove all dangling build cache.
Are you sure you want to continue? [y/N] y
出力には、解放された容量が表示されます。この容量は、もはや必要のないダングリングビルドキャッシュレイヤーによって占有されていたものです。
ダングリングビルドキャッシュを削除することで、アクティブなイメージレイヤーで使用されていないディスク容量を回復することができます。
すべての未使用のビルドキャッシュを削除する
このステップでは、すべての未使用ビルドキャッシュを削除する方法を学びます。ダングリングキャッシュを削除すると、どのイメージにも関連付けられていないレイヤーが削除されますが、すべての未使用キャッシュを削除すると、実行中のコンテナで現在使用されていない、またはローカルイメージによって参照されていないすべてのビルドキャッシュが削除されます。これは、ディスク容量を解放するためのより積極的な方法です。
まず、別の Dockerfile を使用して別のイメージを作成し、より多くのビルドキャッシュを追加しましょう。
もしまだ ~/project ディレクトリにいない場合は、そのディレクトリに移動します。
cd ~/project
Dockerfile.another という名前の新しい Dockerfile を作成します。
nano Dockerfile.another
Dockerfile.another に以下の内容を追加します。
FROM alpine:latest
RUN apk update && apk add --no-cache git
COPY . /app2
WORKDIR /app2
CMD ["git", "--version"]
ファイルを保存し、nano エディターを終了します(Ctrl + X を押し、次に Y を押し、最後に Enter を押します)。
この Dockerfile は alpine ベースイメージを使用し、git をインストールします。
次に、この新しい Dockerfile を使用してイメージをビルドします。anotherimage:latest というタグを付けます。
docker build -t anotherimage:latest -f Dockerfile.another .
このビルドにより、この Dockerfile に固有の新しいビルドキャッシュレイヤーが作成されます。
すべての未使用ビルドキャッシュを削除するには、フィルターを指定せずに docker builder prune コマンドを使用します。
docker builder prune -a
-a フラグは "all" の意味で、ダングリングキャッシュだけでなく、すべての未使用ビルドキャッシュを削除することを示します。
操作を確認するように促されます。y と入力して Enter を押します。
WARNING! This will remove all unused build cache.
Are you sure you want to continue? [y/N] y
出力には、解放された容量が表示されます。このコマンドは、ローカルイメージまたは実行中のコンテナによって現在参照されていないすべてのビルドキャッシュレイヤーを削除します。これにより、特に多数のビルドやイメージ更新の後に、かなりのディスク容量を解放することができます。
すべての未使用キャッシュを削除すると、ローカルにまだ保存しているイメージの後続のビルドが、削除されたキャッシュレイヤーに依存している場合、時間がかかる可能性があることに注意してください。
フィルターを使用してビルドキャッシュを削除する
このステップでは、フィルターを使用してビルドキャッシュを削除する方法を探ります。フィルターを使用すると、特定の条件に基づいてビルドキャッシュを選択的に削除でき、削除対象をより細かく制御することができます。
前のステップで dangling=true フィルターを見ました。もう 1 つの便利なフィルターは until で、特定のタイムスタンプより前に作成されたビルドキャッシュを削除できます。
まず、最近のビルドキャッシュがあることを確認するために、myimage:cachetest イメージを再度ビルドしましょう。
もしまだ ~/project ディレクトリにいない場合は、そのディレクトリに移動します。
cd ~/project
イメージを再度ビルドします。
docker build -t myimage:cachetest -f Dockerfile.cache .
次に、特定の時間より古いビルドキャッシュを削除したいシナリオをシミュレートしましょう。デモンストレーションのために、数分前より古いキャッシュを削除するフィルターを使用します。
特定の時間より古いビルドキャッシュを削除するには、--filter until=<timestamp> オプションを使用できます。タイムスタンプは、5m(5 分)や 2h(2 時間)などの期間を含むさまざまな形式で指定できます。
5 分より古いビルドキャッシュを削除しましょう。
docker builder prune --filter until=5m
操作を確認するように促されます。y と入力して Enter を押します。
WARNING! This will remove all build cache created before 5 minutes ago.
Are you sure you want to continue? [y/N] y
出力には、5 分より前に作成されたビルドキャッシュから解放された容量が表示されます。もしイメージをすぐにビルドしたばかりであれば、5 分より古いキャッシュはあまりないかもしれませんが、時間の経過とともに多数のビルドが行われる実際のシナリオでは、このフィルターは古いキャッシュをクリーンアップするのに非常に役立ちます。
フィルターを組み合わせることもできます。たとえば、特定の時間より古いダングリングキャッシュを削除するには、次のように使用できます。
docker builder prune --filter dangling=true --filter until=24h
これにより、24 時間より古いダングリングビルドキャッシュのみが削除されます。
フィルターを使用することで、ビルドキャッシュの管理に柔軟性がもたらされ、より戦略的にディスク容量を解放することができます。
ストレージを保持しながらビルドキャッシュを削除する
このステップでは、一定量のストレージを残しながらビルドキャッシュを削除する方法を学びます。ディスク容量を解放したいが、将来のビルドを高速化するために最近のビルドキャッシュを一部残したい場合に便利です。
docker builder prune コマンドには --keep-storage オプションがあり、ビルドキャッシュに残す最大ストレージ容量を指定できます。サイズはバイトで指定することも、k、m、g などの単位を使用することもできます。
まず、削除するビルドキャッシュがあることを確認しましょう。前のステップでイメージをビルドした際にキャッシュが作成されています。
もしまだ ~/project ディレクトリにいない場合は、そのディレクトリに移動します。
cd ~/project
特定の量のストレージを残しながらビルドキャッシュを削除するには、--keep-storage オプションの後に希望するサイズを指定します。たとえば、最大 1GB のビルドキャッシュを残すには、次のようにします。
docker builder prune --keep-storage 1g
操作を確認するように促されます。y と入力して Enter を押します。
WARNING! This will remove all build cache exceeding 1GB.
Are you sure you want to continue? [y/N] y
出力には、解放された容量が表示されます。Docker は、ビルドキャッシュの合計サイズが指定された --keep-storage の制限を下回るまで、最も古いビルドキャッシュレイヤーを削除します。
利用可能なディスク容量と、高速なビルドのために残したいキャッシュの量に基づいて、--keep-storage の値を調整できます。たとえば、最大 500MB を残すには、次のようにします。
docker builder prune --keep-storage 500m
再び、y と入力して Enter を押して操作を確認します。
この方法は、ディスク容量の解放とパフォーマンスのためのビルドキャッシュの維持のバランスを取ります。ビルドキャッシュが過度にディスク容量を消費しないように、定期的にビルドキャッシュを削除するのは良い習慣です。
まとめ
この実験では、docker builder prune コマンドを使用して Docker のビルドキャッシュを管理する方法を学びました。まず、Dockerfile を使用して簡単な Docker イメージをビルドすることで、ビルドキャッシュがどのように作成され、Docker がそれを利用して後続のビルドを高速化するかを理解しました。Dockerfile の各命令はレイヤーを作成し、命令が変更されていない場合、Docker はキャッシュから既存のレイヤーを再利用します。
次に、ビルドキャッシュを削除するさまざまな方法を探りました。まず、ダングリングビルドキャッシュ(どのビルドにも関連付けられていないキャッシュエントリ)を削除する方法を学びました。また、すべての未使用ビルドキャッシュを削除し、現在どのイメージにも使用されていないすべてのキャッシュエントリを効果的にクリーンアップする方法も説明しました。さらに、prune コマンドでフィルターを使用して、特定の条件に基づいてビルドキャッシュを選択的に削除する方法を実演しました。最後に、特定のキャッシュエントリに関連付けられたストレージを残しながらビルドキャッシュを削除するオプションを探りました。これは特定のシナリオで役立つ場合があります。



