RUN --mount=type=cache, target=/root/.npm
ってなにしてるの?
-
Docker BuildKitの
--mount=type=cache
オプションを使用し、/root/.npmディレクトリを永続的なキャッシュストレージとして指定しています - これにより、ビルド間でnpmのダウンロード済みパッケージが再利用可能になり、
package.json
に変更がない限り再ダウンロード不要になります
そもそもDocker BuildKitって?
- Docker v23.0以降でデフォルトとなった機能
- 以下の特徴を持っている
- Dockerfile内の命令を依存関係に基づいて並列実行できる
- ビルドキャッシュが最適化され、変更がない部分は再実行せずに済む ... and more
じゃあ、そのキャッシュはどこに保存されるの?
- 直接ホストの
/root/.npm
には存在せず、BuildKitが管理する内部キャッシュ領域に保持される - 具体的には、Dockerのデータディレクトリ内(多くの場合、
var/lib/docker/buildkit
配下)
Github Actionsのワークフローで実行しても、終了時にキャッシュが削除されちゃうんじゃ?
- Github Actionsは各ワークフロー実行時に用意される一時的な環境であり、ワークフロー終了時または、ジョブ終了時にその環境が破棄される
- 外部キャッシュとしてエクスポートする仕組みを導入しない限り、そのキャッシュも次回のワークフロー実行時には利用できない
じゃあ、Github Actionsでどうやってキャッシュをエクスポートするの?
Dcoker公式のactionsを使おう!(docker/build-push-action@v6
)
使用例
-name: 'イメージのビルド&プッシュ'
uses: docker/build-push-action@v6
with:
push: true
tags: ここにタグを入力
cache-from: type=gha
cache-to: type=gha, mode=max
解説
docker/build-push-action@v6
- BuildKitを活用した高度なDockerイメージのビルド・プッシュ機能が使える
push
- 機能: ビルド完了後のレジストリへのプッシュ制御
-
選択肢:
-
true
: 常にプッシュ実行 -
false
: ビルドのみ実行 - 条件式: ${{ github.event_name != 'pull_request' }}(PR時はプッシュしない)
-
cache-from/cache-to (オプション)
- 機能: ビルドキャッシュの管理
タイプ | 説明 |
---|---|
gha |
GitHub Actionsキャッシュ |
registry |
レジストリをキャッシュストア |
inline |
イメージにキャッシュ埋め込み |
local |
ローカルファイルキャッシュ |
cache-from:type=gha
以前エクスポートしたキャッシュが読み込まれ、変更ないレイヤーは再ビルドされずに済む
cache-to:type=gha, mode-max
ビルドした各レイヤーのキャッシュがGithub ActionsのキャッシュAPIを経由してリモートに保存される
-
mode
-
min
(デフォルト): 最終レイヤーのみキャッシュ -
max
: 中間レイヤーを含む全キャッシュ保存
-