如何防止docker在错误时停止/删除容器

时间:2018-11-08 08:22:13

标签: linux bash docker jenkins-pipeline jenkins-groovy

考虑一下,我有一个运行docker容器的Jenkins groovy代码,其中将运行一些bash:

    docker.withRegistry(dockerRegistry, dockerCredentials) {
    docker.image(new String(dockerImage + ":" + dockerVersion)).inside(mountCommand) {

        try {
            withEnv(["AWS_PROFILE=${mappings['stackEnv']}",
                     "FULL_PACKAGE_VERSION=${mappings['revision']}",
                     "ARTIFACTORY_USER=${IC_ARTIFACTORY_USER}"]) {
                withCredentials([
                        string(credentialsId: IC_ARTIFACTORY_KEY, variable: 'ARTIFACTORY_KEY')
                ]) {
                    sh '''
                    bash -x Jenkinsfile-e2e-test.sh
                '''
                }
            }
        } finally { }
    }
}

如果Jenkinsfile-e2e-test.sh由于某种原因掉落,詹金斯将自动停止并卸下容器:

09:40:08 $ docker stop --time=1 6e78cf6d940cb1ca1cb1c729617fd3e6ba3fa4085c2750908dff8f2a1e7ffeed
09:40:09 $ docker rm -f 6e78cf6d940cb1ca1cb1c729617fd3e6ba3fa4085c2750908dff8f2a1e7ffeed

如何防止詹金斯在失败时破坏容器?

2 个答案:

答案 0 :(得分:2)

.inside命令的主体完成后,詹金斯将始终停止并移除容器。无论您的bash脚本成功还是失败。

背后的理由是詹金斯(Jenkins)会为您做好家务,以防止您最终在构建机器上挂满大量停下来的容器。

Image.withRunImage.inside方法就是这种情况。 如果要控制容器的生命周期,则应使用Image.run

  

使用docker run来运行映像,并返回一个容器,稍后您可以停止

(来自docs

答案 1 :(得分:1)

您可以使用以下命令确保命令不会失败:

bash -x Jenkinsfile-e2e-test.sh || true

甚至更好:

bash -x Jenkinsfile-e2e-test.sh > e2e.log 2>&1 & || true
# check the log file and do something based on the log