当我的 sh 脚本在内部失败时,我如何失败 docker 运行

How do i fail docker run when my sh script fails inside

我有一个文件可以安装我们需要的一些工具。安装工具后,我的 sh 脚本正在验证安装,如果未找到任何工具,则它应该会失败。我在我的 gitlab-ci 文件中使用这种方法。

sh 脚本工作正常并退出,但是当我在 docker 运行 中使用它时,docker 不会因错误退出。

test.sh:

    echo "Validating Docker Installation"
    which docker
    if [ $? -eq 0 ]
    then
       docker --version | grep "Docker Version"
       if [ $? -eq 0 ] 
       then
          echo "Docker installed successfully"
       else
          echo $?
          exit 1
        fi
    else
     echo "Docker didnt installed"
     exit 1
    fi 

gitlab-ci.yml(测试作业)

test_job:
  stage: test
  script:
    - docker pull $DOCKER_REGISTRY/$DOCKER_REPO:$BUILD_VERSION
    - docker run --rm $DOCKER_REGISTRY/$DOCKER_REPO:$BUILD_VERSION sh ./test.sh

GitLab 的作业将在作业以非 0 状态代码从上一个命令退出时失败。所以真的,你在这里问的问题是“我如何让 docker run return 成为容器内脚本 运行 的状态代码?”答案是你不能 - 一旦容器完成 运行ning,你必须查询脚本的状态代码,然后使用“退出”来引发相同的状态代码。如果你 运行 exit 0,作业就会成功。如果你 运行 exit 1,它将失败。将其与您的示例放在一起,您将获得以下示例,使用 docker inspect 命令提取 运行 容器的退出代码,我现在将其命名为 test 以便我们可以在下一个命令中轻松提取退出代码。

现在,如果您的容器 return 是一个非 0 的退出代码,下一个命令基本上会回显该退出代码,从而导致您的作业根据 运行 的状态通过或失败容器。

test_job:
  stage: test
  script:
    - docker pull $DOCKER_REGISTRY/$DOCKER_REPO:$BUILD_VERSION
    - docker run --name test --rm $DOCKER_REGISTRY/$DOCKER_REPO:$BUILD_VERSION sh ./test.sh
    - exit $(docker inspect test --format='{{.State.ExitCode}}')