考虑一下,我有一个运行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
如何防止詹金斯在失败时破坏容器?
答案 0 :(得分:2)
.inside
命令的主体完成后,詹金斯将始终停止并移除容器。无论您的bash脚本成功还是失败。
背后的理由是詹金斯(Jenkins)会为您做好家务,以防止您最终在构建机器上挂满大量停下来的容器。
Image.withRun
和Image.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