GNU/Linux >> Linux の 問題 >  >> Panels >> Docker

Dockerキャッシュ–クリーンなイメージの再構築とDockerキャッシュのクリアを行う方法

コンテナを使用すると、多くの環境で実行できるポータブルな方法でアプリケーションをパッケージ化できます。最も人気のあるコンテナプラットフォームは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を指定するか すべてのコマンドを実行するオプション。または、可能な限りキャッシュします。

キャッシュバスティングにDocker引数を使用する方法

別のオプションでは、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)を提供する 、パラメータを常に異なる値に設定すると、後続のすべてのレイヤーが再構築されます。


Docker
  1. Dockerイメージを変更する方法

  2. Dockerfileを使用してカスタムDockerイメージを自動的に構築および構成する方法–パート3

  3. コンテナと Dockerfile から Docker イメージを作成する方法

  1. ホスト間でDockerイメージを移動する方法

  2. Dockerコンテナをエクスポートおよびインポートする方法

  3. Dockerイメージをあるサーバーから別のサーバーにパッケージ化して転送する方法

  1. Dockerイメージとコンテナーを最新バージョンに更新する方法

  2. Dockerfileを使用してDockerイメージを構築する方法

  3. Dockerイメージに変更をコミットする方法