Docker多阶段构建分支而不是链

时间:2019-09-06 09:21:43

标签: node.js docker

我想对开发和生产图像使用多阶段构建。我目前在节点环境中。

我希望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。我想做些叉子:

节点->基本->开发人员或节点->基本->产品 代替 节点->基本->开发人员或节点->基本->开发->产品

有可能吗?

如果不是,我的问题是一个真正的问题,还是我试图实现一个无用的目标,因为生产映像覆盖了开发映像的特性,因此我不关心整个过程吗?

1 个答案:

答案 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中设置功能标记