コンテナを使用すると、多くの環境で実行できるポータブルな方法でアプリケーションをパッケージ化できます。最も人気のあるコンテナプラットフォームはDockerです。
このチュートリアルでは、Dockerビルドキャッシュを活用する方法について説明します。
イメージの構築は、高速で効率的かつ信頼できるものでなければなりません。 Dockerイメージの概念には、不変のレイヤーが付属しています。実行するすべてのコマンドは、前のレイヤーと比較した変更を含む新しいレイヤーになります。
以前に構築されたすべてのレイヤーはキャッシュされ、再利用できます。ただし、インストールが外部リソースに依存している場合、Dockerキャッシュが問題を引き起こす可能性があります。
Dockerビルドキャッシュを活用する方法
Dockerビルドキャッシュの問題を理解するために、簡単なカスタムnginxDockerアプリケーションをビルドしましょう。イメージをビルドする前に、ライブラリを更新してカスタムスタートページを追加するDockerfileを作成します。
FROM nginx:1.21.6
# Update all packages
RUN apt-get update && apt-get -y upgrade
# Use a custom startpage
RUN echo '<html><bod>My Custom Startpage</body></html>' > /usr/share/nginx/html/index.html
これで、Dockerイメージをビルドできます:
$ docker build -t my-custom-nginx .
=> [1/3] FROM docker.io/library/nginx:1.21.6@sha256:e12... 5.8s
=> [2/3] RUN apt-get update && apt-get -y upgrade 3.6s
=> [3/3] RUN echo '<html><bod>My Custom Startpage... 0.2s
=> exporting to image 0.1s
=> exporting layers 0.1s
=> writing image 0.0s
=> naming to docker.io/library/my-custom-nginx
[+] Building 11.3s (7/7) FINISHED
この例では、読みやすくするためにいくつかの出力を削除しました。初めてイメージを作成する場合、かなりの時間がかかることがわかります。私の場合は11.3s
。
実行時間の長いステップの1つは、apt-get update && apt-get -y upgrade
です。 更新される依存関係の数とインターネット速度の速さによって異なります。オペレーティングシステムでパッケージの更新をチェックし、可能な場合はインストールします。
ここで、もう一度実行すると、Dockerビルドキャッシュのメリットが得られます。
$ docker build -t my-custom-nginx .
=> [1/3] FROM docker.io/library/nginx:1.21.6@sha256:e1211ac1… 0.0s
=> CACHED [2/3] RUN apt-get update && apt-get -y upgrade 0.0s
=> CACHED [3/3] RUN echo '<html><bod>My Custom Startpage... 0.0s
=> exporting to image 0.0s
=> exporting layers 0.0s
=> writing image 0.0s
=> naming to docker.io/library/my-custom-nginx
Building 1.1s (7/7) FINISHED
今回は、以前にビルドされたすべてのイメージを再利用できるため、イメージのビルドは非常に高速です。 Dockerfileでスタートページをカスタマイズすると、キャッシュの動作がどのように影響を受けるかがわかります。
FROM nginx:1.21.6
# Update all packages
RUN apt-get update && apt-get -y upgrade
# Use a custom startpage
RUN echo '<html><bod>New Startpage</body></html>' > /usr/share/nginx/html/index.html
次に、イメージを再度作成します:
$ docker build -t my-custom-nginx .
=> [1/3] FROM docker.io/library/nginx:1.21.6@sha256:e1211ac1… 0.0s
=> CACHED [2/3] RUN apt-get update && apt-get -y upgrade 0.0s
=> [3/3] RUN echo '<html><bod>My Custom Startpage... 0.2s
=> exporting to image 0.0s
=> exporting layers 0.0s
=> writing image 0.0s
=> naming to docker.io/library/my-custom-nginx
Building 2.1s (7/7) FINISHED
今回は、RUN
を認識したため、最後のレイヤーのみを再構築しました。 コマンドが変更されました。ただし、集中的な2番目のビルド手順を再利用し、オペレーティングシステムの依存関係を更新しませんでした。
キャッシング動作はインテリジェントです。 1つのステップを再構築する必要があると、後続のすべてのステップが再構築されます。したがって、頻繁に変更されるパーツをDockerfile
の最後に配置することをお勧めします。 以前のビルドレイヤーを再利用します。
それでも、パッケージの更新を強制するために、キャッシュされたレイヤーの再構築を強制したい場合があります。アプリケーションを安全に保ち、利用可能な場合は最新の更新を使用するため、強制的に再構築が必要になる場合があります。
Dockerビルドの使用方法--no-cache
オプション
ビルドキャッシュを無効にする理由はさまざまです。 --no-cache
を使用すると、キャッシュされたレイヤーを使用せずにベースイメージからイメージを再構築できます。 オプション。
$ docker build -t my-custom-nginx .
=> CACHED [1/3] FROM docker.io/library/nginx:1.21.6@sha256:... 0.0s
=> [2/3] RUN apt-get update && apt-get -y upgrade 3.5s
=> [3/3] RUN echo '<html><bod>My Custom Startpage... 0.2s
=> exporting to image 0.1s
=> exporting layers 0.0s
=> writing image 0.0s
=> naming to docker.io/library/my-custom-nginx
Building 5.5s (7/7) FINISHED
新しいレイヤーが構築され、使用されました。 docker build
今回は両方のコマンドを実行します。これには、オールオアナッシングアプローチが付属しています。 --no-cache
を指定するか すべてのコマンドを実行するオプション。または、可能な限りキャッシュします。
別のオプションでは、Dockerfileに小さな開始点を提供できます。 Dockerfileを次のように編集する必要があります:
FROM nginx:1.21.6
# Update all packages
RUN apt-get update && apt-get -y upgrade
# Custom cache invalidation
ARG CACHEBUST=1
# Use a custom startpage
RUN echo '<html><bod>New Startpage</body></html>' > /usr/share/nginx/html/index.html
CACHEBUST
を追加します 再構築を強制する場所にあるDockerfileへの引数。これで、Dockerイメージをビルドし、次のすべてのコマンドを再実行するために常に異なる値を指定できます。
$ docker build -t my-custom-nginx --build-arg CACHEBUST=$(date +%s) .
=> [1/3] FROM docker.io/library/nginx:1.21.6@sha256:e1211ac1... 0.0s
=> CACHED [2/3] RUN apt-get update && apt-get -y upgrade 0.0s
=> [3/3] RUN echo '<html><bod>My Custom Startpage... 0.3s
=> exporting to image 0.0s
=> exporting layers 0.0s
=> writing image 0.0s
=> naming to docker.io/library/my-custom-nginx
Building 1.0s (7/7) FINISHED
--build-arg CACHEBUST=$(date +%s)
を提供する 、パラメータを常に異なる値に設定すると、後続のすべてのレイヤーが再構築されます。