2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Next.js の Docker ビルドにおける build context と COPY 順序見直しメモ

2
Posted at

はじめに

  • Next.js の Docker ビルドで、コード変更時のキャッシュ再利用が期待ほど効かない場面があった。

  • ビルドコンテキストにおける COPY 対象と、依存インストールの cache key を分けて考える必要があった。

要旨

確認したのは次の 2 点。

  1. .dockerignore で不要なファイルをビルドコンテキストから外す
  2. COPY package*.json ./RUN npm ciCOPY . . の順にして、依存インストールのキャッシュ境界を分ける

確認した現象

  • Next.js フロントエンドの Docker ビルドで、外部キャッシュを使っていても一部の処理が再実行されることがあった。

  • ログを見ると、キャッシュが完全に無いわけではなく、特定の COPY 以降で cache miss していた。

  • 同一コミットの再実行ではキャッシュが効いていたため、外部キャッシュの有無より、どの命令から cache miss しているかが重要だった。

Path context と build context

  • Docker の build cache は命令ごとに判定される。COPY / ADD では、コピー対象ファイルのメタデータなどから cache checksum が計算される。
  • 対象ファイルの内容やファイル集合が変われば、その COPY は cache miss になる。

用語は次の意味で使用。

  • cache key: キャッシュを再利用できるか判定するための条件

  • cache checksum: COPY / ADD などで、対象ファイルの情報から計算される判定用の値

  • チェックアウト済みディレクトリを build context にすると、.dockerignore で除外していないファイルは COPY の判定対象になり得る。

  • Git メタデータやローカル生成物のようにビルドに不要なファイルは、アプリコード以外の変化で cache key に影響し得る。

  • 見直しの対象は、変わりやすい入力と安定しやすい依存インストールを同じ cache key に寄せないこと。

  • ビルドに必要ないメタデータやローカル生成物は build context から外しておく方が扱いやすい。

見直し: build context の整理

  • .dockerignore で、ビルドに不要なファイルを除外する。

  • .dockerignore とあわせて、Dockerfile 側でも依存インストールとアプリコードの COPY を分ける。ソースコード変更時に npm ci まで再実行範囲に入らないようにするため。

  • 依存ファイルだけを先にコピーし、lockfile が変わらない限り npm ci を再利用できる形にする。

COPY package.json package-lock.json ./
RUN npm ci

COPY . .
  • ソースコード変更時も npm cipackage-lock.json が変わらなければ再利用されやすい。

確認結果

  • build context の整理後、コード変更時に依存インストールが再実行されるケースは減った。初回相当のビルドや同一コミット再実行よりも、コード変更ありのビルドで差が出た。

  • 一方で、.dockerignore による転送量削減だけでは体感できるほどの短縮は出なかった。このケースでは、COPY . . の対象と位置を見直し、時間のかかるレイヤーを再利用できるようにしたことの方が効いていた。

  • .dockerignore を変更すると COPY 対象のファイル集合が変わるため、追加直後はその COPY 以降で一度 cache miss が広がり得る。

参考

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?