generated at
Dockerのbuild cache
from Docker






なんか異様に文章が分かりづらい
前提を知らなすぎるだけかもしれない


Dockerのbuild時のcache
DockerfileからDocker Imageを作成する際にcacheを保存し、buildを高速化する

cacheの仕組み
Docker ImageはDockerのImage Layerの積み重ねで階層的に構成される
各image layerの内容を元にhash値を計算する
layerの内容が変わるとhash値も変わる
build時に、前回のhash値と一致するかどうかでcacheを使うかどうかを決定する

cacheの利用条件
以下の条件を満たす場合にキャッシュを使用しますGPT-4
そのステップの命令が変更されていない。
そのステップで使用されるファイルやディレクトリが変更されていない。
そのステップの前のステップの結果がキャッシュされている。


cacheが使えない以降のlayerは全部cacheが破棄される
>
例えば、こういう順序でdockerfileを書いてしまうと、
dockerfile
COPY src src RUN npm install
src/ の内容を編集して、docker buildするたびに、 npm install が再実行されて遅い


dockerfile
FROM node:16 WORKDIR /app COPY package.json package-lock.json ./ RUN npm install COPY . . CMD ["node", "index.js"]
このDockerfileでは、以下のようにキャッシュが利用されます
1. ** FROM node:16 **:
このレイヤーは常にキャッシュされます。基本イメージが変更されない限り、再利用されます。
2. ** WORKDIR /app
作業ディレクトリを設定する命令もキャッシュされます。
3. ** COPY package.json package-lock.json ./
これらのファイルが変更されない限り、このステップはキャッシュされます。
4. ** RUN npm install
package.json package-lock.json が変更されない場合、 npm install の結果はキャッシュされます。これにより、依存関係が再インストールされることはありません。
5. ** COPY . .
アプリケーションのソースコードを全てコピーします。このステップが実行されると、後続のステップはキャッシュされなくなります。
6. ** CMD ["node", "index.js"]
最後に、アプリケーションを実行するコマンドを指定します。このコマンドはキャッシュの対象ではありません。
そうなんだmrsekut


キャッシュを無効化する方法
場合によっては、キャッシュを無効化したいこともあります。以下の方法でキャッシュを無効化できます:
- ** --no-cache オプション**:
`bash
docker build --no-cache -t myapp .
`
このオプションを使用すると、すべてのステップを再実行し、キャッシュを使用しません。

- **ファイルを変更**:
- 依存関係のファイル(例: package.json )を変更することで、関連するレイヤーのキャッシュを無効化できます。