Docker多阶段构建指定--target=test时仍执行development阶段指令是否正常?
结论
这一现象不属于预期的多阶段构建行为,由Docker旧版默认的Legacy构建器的执行逻辑导致。
具体原因
Docker 18.09版本之前默认使用的传统构建器是线性解析Dockerfile的,会按照阶段的书写顺序依次执行所有在你指定的目标阶段之前定义的阶段,不会主动识别阶段之间的依赖关系。
你给出的Dockerfile里development阶段写在test阶段的前面,虽然test阶段的父镜像是builder-base,完全不需要依赖development阶段的产物,旧构建器依然会先跑完development阶段的所有指令,再继续执行test阶段的构建。
修复方法
启用Docker官方推出的BuildKit构建器即可解决该问题,BuildKit会自动梳理目标阶段的依赖树,仅构建必要的关联阶段,跳过所有无关的阶段:
- 单次构建临时生效:执行命令前添加环境变量即可
DOCKER_BUILDKIT=1 docker build -t myimage --target=test .
- 全局永久生效:在Docker的daemon配置文件
/etc/docker/daemon.json中添加如下配置,之后重启Docker服务即可
{ "features": { "buildkit": true } }
启用后重新执行构建,development阶段的指令不会再被执行,符合预期。
内容的提问来源于stack exchange,提问作者Альберт Александров
相关产品推荐
相关产品推荐

