使用不同的基本映像重新使用Dockerfile

使用不同的基本映像重新使用Dockerfile,docker,dockerfile,Docker,Dockerfile,我有一个Dockerfile,当前使用节点:10.21.0-buster-slim作为其基础。这对于在生产环境中运行非常有效,因为我得到了一个很好的小映像(我不想使用Alpine,因为我以前在Alpine上遇到过这个代码的问题,并且我已经在生产环境中运行了一个基于buster slim的MySQL映像)。然而,对于开发来说,拥有一个包含更多工具的图像显然是很好的,用于诊断突然出现的问题(可能基于debian:buster或buildpack-deps:buster) 是否有某种方法可以在不必复制

我有一个Dockerfile,当前使用
节点:10.21.0-buster-slim
作为其基础。这对于在生产环境中运行非常有效,因为我得到了一个很好的小映像(我不想使用Alpine,因为我以前在Alpine上遇到过这个代码的问题,并且我已经在生产环境中运行了一个基于buster slim的MySQL映像)。然而,对于开发来说,拥有一个包含更多工具的图像显然是很好的,用于诊断突然出现的问题(可能基于
debian:buster
buildpack-deps:buster


是否有某种方法可以在不必复制Dockerfile内容的情况下对两个不同的基本图像运行相同的步骤?我想答案是肯定的,有一些多阶段的构建魔法,但我还没有弄清楚这应该如何工作。在我的梦想世界中,开发和产品构建步骤之间也有一些细微的差异(例如,
--only=production
参数到
npm install
,但是如果我不得不避免维护两个几乎相同的Dockerfiles,我愿意牺牲这一点。

多阶段构建魔法是一种方法:

ARG TARGET="prod"

FROM node:10.21.0-buster-slim as prod
# do stuff

FROM debian:buster as dev
# do other stuff, like apt-get install nodejs

FROM ${TARGET}
# anything in common here
使用
DOCKER\u BUILDKIT=1 DOCKER Build--Build arg'TARGET=dev'[…]
构建映像以获取特定于开发的内容。使用
DOCKER\u BUILDKIT=1 DOCKER Build[…]构建映像以获取现有的“产品”填充。如果省略了
--build ARG
标志,则关闭第一行
ARG
中的值以更改默认行为


使用
DOCKER\u BUILDKIT=1
环境标志很重要;如果不使用它,构建将始终执行所有三个阶段。拥有的阶段越多,执行的条件越多,这将成为一个更大的问题。当包含它时,构建将执行文件中的最后一个阶段,并且只执行之前需要的阶段y来完成多阶段构建。这意味着,对于
TARGET=prod
dev
阶段从不执行,反之亦然。

多阶段构建魔法是一种实现方法:

ARG TARGET="prod"

FROM node:10.21.0-buster-slim as prod
# do stuff

FROM debian:buster as dev
# do other stuff, like apt-get install nodejs

FROM ${TARGET}
# anything in common here
使用
DOCKER\u BUILDKIT=1 DOCKER Build--Build arg'TARGET=dev'[…]
构建映像以获取特定于开发的内容。使用
DOCKER\u BUILDKIT=1 DOCKER Build[…]构建映像以获取现有的“产品”填充。如果省略了
--build ARG
标志,则关闭第一行
ARG
中的值以更改默认行为

使用
DOCKER\u BUILDKIT=1
环境标志很重要;如果不使用它,构建将始终执行所有三个阶段。拥有的阶段越多,执行的条件越多,这将成为一个更大的问题。当包含它时,构建将执行文件中的最后一个阶段,并且只执行之前需要的阶段y来完成多阶段构建。这意味着,对于
TARGET=prod
dev
阶段从不执行,反之亦然