避免每次构建 docker 镜像时都推送 node_modules

避免每次构建 docker 镜像时都推送 node_modules

所以我有一个 NodeJS 项目,每次有变化时我都会构建镜像并将其推送到我们的注册表。现在的问题是我不想每次推送到注册表时都上传,因为它永远不会改变,或者更确切地说,我只想在有变化时才node_modules推送。node_modules

为了解决这个问题,我将其放入了node_modules自己的卷中,但它仍然被上传,因为我认为卷的哈希值每次都会发生变化,使其变得独一无二,即使包中没有变化。有办法解决这个问题吗?我真的不想重新上传注册表中已有的文件。

以下是我的Dockerfile

FROM node:12-alpine
ENV PORT=5000
EXPOSE 5000
WORKDIR /usr/app
VOLUME /usr/app/node_modules
COPY . .
RUN npm ci
ENTRYPOINT [ "node", "index.js" ]

注意:npm i两者npm ci都会导致新图像被推送。

答案1

所以我想出了一个解决方案,它满足了我的需要,但可能不是最好的或正确的。

我制作了两个图像,一个只有图像node_modules,没有其他内容,另一个使用该图像作为项目的基础图像。这样,每当代码发生变化时,我都可以将第二个图像推送到注册表,它将使用注册表中的基础图像。如果软件包发生变化,我可以更新这两个图像。

这样我就不必node_modules每次都上传到注册表。

执行:

# node_modules only
FROM node:12-alpine
WORKDIR /usr/app
COPY package-lock.json .
COPY package.json .
RUN npm ci
# node code
FROM myregistry:project-nm:latest
WORKDIR /usr/app
RUN ls
ENV PORT=5000
EXPOSE 5000
COPY . .
ENTRYPOINT [ "node", "index.js" ]

有人可能会想,我为什么要这么做,node_modules每次我修改代码时,上传图片的一部分都花了太长时间。我不得不上传大约 70MB 的文件node_modules,只是为了实现几行代码的更改。这感觉效率低下。所以我寻找解决方案。

问候!

相关内容