Dockerfile-使用目标的哪个选项?

问题描述

我有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