gpt4 book ai didi

node.js - 碰撞 package.json 版本而不使 docker 缓存失效

转载 作者:IT老高 更新时间:2023-10-28 21:38:15 25 4
gpt4 key购买 nike

我正在使用一个非常标准的 Dockerfile 来容器化 Node.js 应用程序:

# Simplified version
FROM node:alpine

# Copy package.json first for docker build's layer caching
COPY package.json package-lock.json foo/
RUN npm install

COPY src/ foo/
RUN npm run build

将我的 COPY 分成两部分是有利的,因为它允许 Docker 缓存(长)npm install 步骤。

然而,最近,我开始使用 semver 提升我的 package.json 版本。这具有使 npm install 步骤的 Docker 缓存无效的副作用,显着延长了我的构建时间。

有没有我可以使用的替代缓存策略,以便 npm install 仅在我的依赖项更改时运行?

最佳答案

这是我的看法,基于其他答案,但更短且使用 jq :

Dockerfile:

FROM endeveit/docker-jq AS deps

# https://stackoverflow.com/a/58487433
# To prevent cache invalidation from changes in fields other than dependencies

COPY package.json /tmp

RUN jq '{ dependencies, devDependencies }' < /tmp/package.json > /tmp/deps.json

FROM node:12-alpine

WORKDIR /app

COPY --from=deps /tmp/deps.json ./package.json
COPY package-lock.json .

RUN npm ci
# https://docs.npmjs.com/cli/ci.html#description

COPY . .

RUN npm run build

LABEL maintainer="Alexey Vishnyakov <n3tn0de@gmail.com>"

我提取dependenciesdevDependencies字段到一个单独的文件,然后在下一个构建步骤中,我将它从上一步复制为 package.json (COPY --from=deps /tmp/deps.json ./package.json)。

RUN npm ci 之后, COPY . .将覆盖内脏 package.json使用原始版本(您可以通过在 RUN cat package.json 命令后添加 COPY . . 来测试它。

请注意 npm-scripts commands喜欢 postinstall不会运行,因为它们在 npm ci 期间不存在于文件中如果 npm ci is running from root 并且没有 --unsafe-perm

COPY . . 之后运行命令或/和(如果需要)通过 jq 包含它们(更改命令将使缓存层无效)或添加--unsafe-perm

Dockerfile:

FROM endeveit/docker-jq AS deps

COPY package.json /tmp

RUN jq '{ dependencies, devDependencies, peerDependencies, scripts: (.scripts | { postinstall }) }' < /tmp/package.json > /tmp/deps.json
# keep postinstall script

FROM node:12-alpine

WORKDIR /app

COPY --from=deps /tmp/deps.json ./package.json
COPY package-lock.json .

# RUN npm ci --unsafe-perm
# allow postinstall to run from root (security risk)

RUN npm ci
# https://docs.npmjs.com/cli/ci.html#description

RUN npm run postinstall

...

关于node.js - 碰撞 package.json 版本而不使 docker 缓存失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51110793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com