重复使用具有不同基础映像的Dockerfile

时间:2020-06-03 22:19:29

标签: docker dockerfile

我有一个Dockerfile,当前使用node:10.21.0-buster-slim作为其基础。这对于在生产环境中运行很有效,因为我得到了一个很好的小映像(我宁愿不使用Alpine,因为我之前在Alpine上遇到了与此代码有关的问题,并且我已经停留在基于buster-slim的MySQL映像上了生产)。但是,对于开发人员而言,拥有一张带有更多工具来诊断出现问题的工具显然很不错(大概基于debian:busterbuildpack-deps:buster)。

是否有某种方法可以对两个不同的基本映像运行相同的步骤,而不必重复Dockerfile的内容?我认为对于某些多阶段构建魔术来说答案是肯定的,但是我还没有弄清楚它应该如何工作。在我梦dream以求的世界中,开发人员和生产人员的构建步骤之间也存在一些次要差异(例如,--only=production的{​​{1}}参数,但是我愿意在我必须避免维护两个几乎相同的Dockerfile。

1 个答案:

答案 0 :(得分:2)

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

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_BUILDKIT=1 docker build --build-arg 'TARGET=dev' [...]构建映像以获取特定于开发的内容。使用DOCKER_BUILDKIT=1 docker build [...]构建映像以获取现有的“ prod”素材。如果省略了ARG标志,请切换出第一行--build-arg中的值以更改默认行为。

使用DOCKER_BUILDKIT=1环境标志很重要;如果不考虑,构建将始终完成所有三个阶段。拥有更多的阶段以及执行​​更多的有条件的工作,这将成为一个更大的问题。当包含它时,构建将执行文件中的最后一个阶段,并且仅执行完成多阶段构建所必需的先前阶段。意思是,对于TARGET=proddev阶段从不执行,反之亦然。