Dockerのbuild cache
なんか異様に文章が分かりづらい
前提を知らなすぎるだけかもしれない
Dockerのbuild時のcache
DockerfileからDocker Imageを作成する際にcacheを保存し、buildを高速化する
cacheの仕組み
各image layerの内容を元にhash値を計算する
layerの内容が変わるとhash値も変わる
build時に、前回のhash値と一致するかどうかでcacheを使うかどうかを決定する
cacheの利用条件
以下の条件を満たす場合にキャッシュを使用します

そのステップの命令が変更されていない。
そのステップで使用されるファイルやディレクトリが変更されていない。
そのステップの前のステップの結果がキャッシュされている。
cacheが使えない以降のlayerは全部cacheが破棄される
>
例えば、こういう順序でdockerfileを書いてしまうと、
dockerfileCOPY src src
RUN npm install
src/
の内容を編集して、docker buildするたびに、 npm install
が再実行されて遅い
dockerfileFROM 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"]
最後に、アプリケーションを実行するコマンドを指定します。このコマンドはキャッシュの対象ではありません。
そうなんだ

キャッシュを無効化する方法
場合によっては、キャッシュを無効化したいこともあります。以下の方法でキャッシュを無効化できます:
- ** --no-cache
オプション**:
`bash
docker build --no-cache -t myapp .
`
このオプションを使用すると、すべてのステップを再実行し、キャッシュを使用しません。
- **ファイルを変更**:
- 依存関係のファイル(例: package.json
)を変更することで、関連するレイヤーのキャッシュを無効化できます。