目前公司內部的 Node.js 後端專案使用 Docker 部署,但現有的建置方式存在以下問題:
yarn install
未善用快取機制,時間可能高達 4 分鐘docker push/pull
需傳輸約 300 MB 的資料,影響部署效率devDependencies
,導致額外的體積與不必要的依賴GitLab CI,Runner 使用 shell executor。
Dockerfile
內先執行 COPY package.json .
,再執行 yarn install
。package.json
無變更,yarn install
可直接利用快取,避免重複安裝。RUN --mount=type=cache
來載入 yarn 快取到 build context:RUN --mount=type=cache,target=/usr/local/share/.cache/yarn \\
yarn install --production --frozen-lockfile
docker build
可共用 yarn 快取,加速 yarn install
。以下是優化後的 Dockerfile
:
FROM node:20 AS builder
WORKDIR /app
COPY package.json yarn.lock ./
RUN --mount=type=cache,target=/usr/local/share/.cache/yarn \\
yarn install --production --frozen-lockfile && \\
mv node_modules prod_node_modules && \\
yarn install --frozen-lockfile
COPY . .
RUN yarn build
FROM node:20 AS app
WORKDIR app
COPY package.json .
COPY --from=builder /app/prod_node_modules ./node_modules
COPY --from=builder /app/dist ./dist
ENTRYPOINT ["node", "--enable-source-maps", "dist/main.js"]