Docker イメージはレイヤーの組み合わせであり、Dockerfile 内の各指示はそれぞれレイヤーを作成します。もし指示が同じであるか、COPY
や ADD
の利用が同じであれば、docker デーモンはビルド間でそれらのレイヤーを再利用することができます。
- jessgreb01 による Digging into Docker layers から画像引用*
もし Dockerfile の上部にビルド番号を含むラベルを記述している場合、毎回のビルドでキャッシュが無効化されてしまいます。
# ファイルの先頭
FROM node:10.22.0-alpine3.11 as builder
# ここでラベルの指定をしないでください!
LABEL build_number="483"
#... Dockerfile の残りの部分がここにきます
docker ignore ファイルは、テスト結果レポートやログ、一時ファイルなど、キャッシュのロジックを壊す可能性のあるファイルのコピーを回避します。
使用するすべてのシステムパッケージが入ったベース Docker イメージを作成することをおすすめします。もしapt
や yum
、apk
などを利用してパッケージインストールする必要が 本当に あるのであれば、最初の指示にすべきです。Node アプリケーションをビルドするのに毎回 make や gcc、g++ を再インストールしたくはないでしょう。
プロダクションアプリケーションなので、便宜のためだけにパッケージをインストールしてはいけません。
COPY "package.json" "package-lock.json" "./"
RUN npm ci
lockfile と package.json はあまり頻繁に変更されません。それらを最初にコピーしておくことで、npm install
ステップをキャッシュすることができ、貴重な時間を節約できます。
COPY . .
RUN npm run build
# node イメージバージョンのエイリアスを作成する
FROM node:10.22.0-alpine3.11 as builder
RUN apk add --no-cache \
build-base \
gcc \
g++ \
make
USER node
WORKDIR /app
COPY "package.json" "package-lock.json" "./"
RUN npm ci --production
COPY . "./"
FROM node as app
USER node
WORKDIR /app
COPY --from=builder /app/ "./"
RUN npm prune --production
CMD ["node", "dist/server.js"]
# node イメージバージョンのエイリアスを作成する
FROM node:10.22.0-alpine3.11 as builder
RUN apk add --no-cache \
build-base \
gcc \
g++ \
make
USER node
WORKDIR /app
COPY "package.json" "package-lock.json" "./"
RUN npm ci
COPY . .
RUN npm run build
FROM node as app
USER node
WORKDIR /app
# 必要なファイルのみをコピーする
COPY --from=builder /app/node_modules node_modules
COPY --from=builder /app/package.json .
COPY --from=builder /app/dist dist
RUN npm prune --production
CMD ["node", "dist/server.js"]
Docker ドキュメント: https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#leverage-build-cache