我想为开发和生产图像使用多阶段构建。我目前在节点环境中。
我希望dev镜像包含所有依赖项(dev和prod),并且不包含源代码(我打算挂载源代码),而生产镜像将仅包含生产依赖项,并且源代码将在其中复制。
这是我的Dockerfile:
FROM node:10.12.0 AS base
WORKDIR /home/app
COPY package*.json ./
FROM base AS development
RUN npm install
CMD ["npm", "run", "debug"]
FROM base AS production
RUN npm install --production
COPY . .
CMD [ "npm", "start" ]
我面临的问题是,当我构建生产镜像时,该过程将遍历整个Dockerfile。我想做些 fork :
节点->基础->开发人员或节点->基础->产品
代替
节点->基本->开发或节点->基本->开发->产品
那可能吗 ?
如果不是,我的问题是一个真正的问题,还是我试图实现一个无用的目标,因为生产镜像覆盖了开发镜像的特性,因此我不关心整个过程吗?
最佳答案
If not, is my issue a real issue or am I trying to achieve a useless goal because the production image overwrite the specificities of the dev image and so I should not care about going through the whole process ?
多阶段图像会创建多个图像,然后标记您要求的图像。在这种情况下,产品镜像中的任何内容都不取决于dev镜像,因此它们是彼此独立创建的。 prod在dev中不会覆盖任何内容,而prod镜像中也不会更改dev中的任何内容。
唯一的影响是构建速度较慢,因为您两次运行了
npm install
,但前提是自上次构建以来package*.json
已更改。如果要进一步加快构建速度,请考虑切换到BuildKit,后者将创建Dockerfile的依赖关系图,并仅运行所需的阶段来创建目标阶段。通过在18.09或更高版本的docker上使用环境变量来启用该功能:export DOCKER_BUILDKIT=1
docker build --target=production image_name:prod .
如果要将其设置为新的默认值,可以在
/etc/docker/daemon.json
中设置一个功能标志
关于node.js - Docker多阶段构建分支而不是链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57819190/