我想对开发和生产图像使用多阶段构建。我目前在节点环境中。
我希望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。我想做些叉子:
节点->基本->开发人员或节点->基本->产品 代替 节点->基本->开发人员或节点->基本->开发->产品
有可能吗?
如果不是,我的问题是一个真正的问题,还是我试图实现一个无用的目标,因为生产映像覆盖了开发映像的特性,因此我不关心整个过程吗?
答案 0 :(得分:1)
如果不是,我的问题是一个真正的问题,还是我试图实现一个无用的目标,因为生产映像覆盖了开发映像的特性,因此我不关心整个过程吗?
多阶段图像创建多个图像,然后标记您要的图像。在这种情况下,产品映像中的任何内容都不取决于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
中设置功能标记