node.js - Docker多阶段构建分支而不是链

标签 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。我想做些 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/

相关文章:

docker - 删除许多文件后如何检查Docker的配置(卷,devicemapper,..)?

Docker 教程,本地主机 :4000 is inaccessible

docker - 基于变量的 ansible docker mount 卷

docker - docker 容器如何公开服务?

node.js - 为什么我们需要 Azure B2C Passport 中的验证发行者?

javascript - 向Sinon 的spy.threw() 传递错误参数时,其行为不符合预期?

windows - 在 Windows 上安装 Node 包时出现 ETIMEDOUT 错误

docker - Kubernetes 和不安全的 docker 注册表

javascript - 监视传递给函数组合的所有参数

node.js - 使用 chef 在 aws 上安装 node.js 的正确方法