2016-07-29 7 views
8

Dockerのレイヤーキャッシュがうまくいくことに驚いていますが、キャッシュされたレイヤーを使用するかどうかを判断する方法も不思議です。ビルド中にキャッシュを使用する時期と使用しない時期をDockerはどのように知っていますか?

のは、これらは、例えば手順を構築してみましょう:

Step 4 : RUN npm install -g node-gyp 
---> Using cache 
---> 3fc59f47f6aa 
Step 5 : WORKDIR /src 
---> Using cache 
---> 5c6956ba5856 
Step 6 : COPY package.json . 
---> d82099966d6a 
Removing intermediate container eb7ecb8d3ec7 
Step 7 : RUN npm install 
---> Running in b960cf0fdd0a 

例えばどのようにそれはnpm install -g node-gypためにキャッシュされた層を使用することができます知っているが、npm installのための新鮮な層を作成していますか?

+3

https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#build-cacheを読んでいますか? – Roman

答えて

3

package.jsonファイルが変更されたためです。Removing intermediate containerを参照してください。

パッケージマネージャ(ベンダー/サードパーティ)の情報ファイルがの場合は、通常docker buildの間に最初に表示されます。その後、パッケージマネージャーのインストールを実行し、アプリケーションの残りの部分、つまりsrcを追加します。

ライブラリを変更していない場合、これらの手順はビルドキャッシュから提供されます。

+0

そのキャッシュは 'Dockerfile'の命令に変更することで無効にすることもできます – Matt

9

ビルドキャッシュプロセスは、Dockerfile best practices build cacheセクションでかなり詳細に説明されています。

  • 次の命令は、そのうちの一つが、まったく同じ 命令を使用して構築されたかどうかを確認するためにその ベースイメージから派生したすべての子の画像と比較され、すでにキャッシュ内にあるベースイメージで開始。そうでなければ、キャッシュは無効にされる。

  • ほとんどの場合、単にDockerfileの命令を子画像の1つと比較するだけで十分です。しかし、特定の 命令では、もう少し検討し説明する必要があります。

  • ADDおよびCOPY命令の場合、イメージ内のファイルの内容が調べられ、各ファイルについてチェックサムが計算されます。 ファイルの最終変更時刻と最終アクセス時刻は、これらのチェックサムで考慮されていない です。キャッシュルックアップ中に、チェックサム は、既存のイメージのチェックサムと比較されます。コンテンツおよびメタデータなどのファイルで が変更された場合は、 キャッシュが無効になります。

  • キャッシュチェックでは、キャッシュ一致を判断するためにコンテナ内のファイルを調べません。 の例では、コマンドを処理する場合、コンテナ内のファイル が更新されて、キャッシュ ヒットが存在するかどうかが調べられません。その場合、コマンド文字列自体は と一致しています。

キャッシュが無効化されたら、それ以降のすべてのDockerfileコマンド は、新たな画像を生成し、キャッシュは使用されません。

あなたはOSパッケージ、NPMパッケージやGitのレポは、新しいバージョン(package.jsonで言う~2.3 semver)に更新される状況に実行されますが、あなたのDockerfilepackage.jsonが更新されていませんよう、ドッキングウィンドウを使用していきますキャッシュ。

よりスマートなチェック(たとえば、最新のgitブランチshasumをリポジトリから取得してクローン命令で使用するなど)で行を修正することで、キャッシュを破棄するプログラムを使ってDockerfileを生成することができます。定期的に更新を実行するために--no-cache=trueでビルドを実行することもできます。

+0

キャッシュを中断する別のオプションは、パッケージの固定バージョンを使用して、ドッカーファイル内のマニュアルを更新することです – Ohmen

+0

@Ohmen True、同様の修正バージョンも 'package.json'にあります。それでもパッケージの依存関係によってまだまだキャッチされる可能性があります。 – Matt

+0

dockerfileのバージョンをマニュアルで更新すると、ドッカーがキャッシュを使用せずにcmdを再実行するのと同じコマンドではありません。 – Ohmen

関連する問題