强制 docker 接受并继续构建具有非零响应/代码的图像的方法

Jit*_*aul 3 yum docker centos7 dockerfile

我有以下 dockerfile,使用 Centos:latest 作为基本映像非常简单。docker 文件在 0 以外的任何命令上退出,因为错误代码/代码 yum check-update 返回状态代码 100 以表示操作成功

docker文件如下

FROM centos:latest
MAINTAINER xyz (xyz@gmail.com)
ENTRYPOINT ["/bin/sh", "-lc", "ocp-indent"]
RUN yum -y check-update
Run Code Online (Sandbox Code Playgroud)

当我尝试构建图像时,该过程按如下方式运行,但它在没有成功构建图像的情况下被杀死

Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos:latest
latest: Pulling from library/centos
7dc0dca2b151: Pull complete 
Digest:   
sha256:b67d21dfe609ddacf404589e04631d90a342921e81c40aeaf3391f6717fa5322
Status: Downloaded newer image for centos:latest
---> 49f7960eb7e4
Step 2/4 : MAINTAINER xyz (xyz@gmail.com)
---> Running in c5284bbfb10e
---> b2334a38cc19
Removing intermediate container c5284bbfb10e
Step 3/4 : ENTRYPOINT /bin/sh -lc ocp-indent
---> Running in 55b9adafca35
---> 02df626e85d6
Removing intermediate container 55b9adafca35
Step 4/4 : RUN yum check-update
---> Running in 3f9d47e74522
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
* base: mirror.its.dal.ca
* extras: centos.les.net
* updates: centos.les.net

binutils.x86_64                    2.27-28.base.el7_5.1                  
updates
gnupg2.x86_64                      2.0.22-5.el7_5                        
updates
python.x86_64                      2.7.5-69.el7_5                        
updates
python-libs.x86_64                 2.7.5-69.el7_5                        
updates
**The command '/bin/sh -c yum check-update' returned a non-zero code: 100**
Run Code Online (Sandbox Code Playgroud)

Cha*_*ffy 9

yum check-update预期与状态100退出,如果有可用的更新,因为它的文档中描述:

  • check-update

    实施后您就可以知道您的机器是否有任何需要应用的更新,而无需以交互方式运行它。如果有可用于更新的包,则返回退出值 100。还以列表格式返回要更新的包列表。如果没有可用于更新的包,则返回 0。如果发生错误,则返回 1。在详细模式下运行也会显示过时。

同样,RUN预期docker命令会在任何非零退出状态下终止。如果要强制命令忽略 100 的退出状态(但仍将其他失败视为错误),可以按如下方式操作:

RUN yum -y check-update || { rc=$?; [ "$rc" -eq 100 ] && exit 0; exit "$rc"; }
Run Code Online (Sandbox Code Playgroud)

DockerRUN命令将任何非零退出状态视为失败是标准的 UNIX 约定(唯一成功的退出状态为 0),并在以下代码中明确实现dockerfile/containerbackend.go

if status := <-waitC; status.ExitCode() != 0 {
    close(finished)
    logCancellationError(cancelErrCh,
        fmt.Sprintf("a non-zero code from ContainerWait: %d", status.ExitCode()))
    return &statusCodeError{code: status.ExitCode(), err: status.Err()}
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,它应该:'RUN' 将任何除 0 以外的退出状态视为错误 (3认同)