问题描述
我有dockerfile
FROM cypress/base:12.1.0 as hlg
RUN mkdir /app workdir /app copY . /app
RUN npm install
RUN $(npm bin)/cypress verify
RUN ["npm","run","cy:runhlg"]
FROM cypress/base:12.1.0 as tst
RUN mkdir /app workdir /app copY . /app
RUN npm install
RUN $(npm bin)/cypress verify
RUN ["npm","cy:runtst"]
然后我构建它
docker build -t cypress --target tst .
但是我每次运行只需要运行一次,当我使用目标“ tst”运行时,它最终会运行两次。
我试图用“ if”来做,但是也没有成功
RUN if [ "$arg" = "hlg" ] ; then echo ["npm","cy:runhlg"] ; else echo ["npm","cy:runhlg"]; fi
docker build -t cypress --build-arg hlg .
我可以用其他方式做到吗?
解决方法
泊坞窗中的经典构建引擎将按顺序处理多阶段构建,直到完成目标阶段,或者最后阶段未指定目标。因此,第一阶段将始终被构建。
如果切换到buildkit,它将Dockerfile处理为依赖关系图,并跳过未使用的阶段。您可以使用以下命令在当前shell中启用buildkit:
export DOCKER_BUILDKIT=1
然后您可以通过启用/etc/docker/daemon.json
中的功能标记将buildkit设置为docker引擎中所有构建的默认设置(daemon.json
也可以在docker的桌面版本中的首选项之一下设置菜单):
{
"features": {"buildkit": true }
}
要处理daemon.json
文件,请重新加载docker引擎,例如systemctl reload docker
。