使用Docker Pipeline插件时,在Jenkins中停止和删除docker容器的正确方法是什么?

时间:2017-07-25 22:52:12

标签: docker jenkins-plugins jenkins-pipeline

我有一个Jenkins管道,用于构建和运行Docker机器,而不是代理,但使用脚本块以及Docker管道插件方法docker.build()Image.run()。这工作正常,但如果构建失败,docker容器将继续运行!我目前在Container.stop()块中有post{ always{} }但它似乎无法正常工作。我不希望ssh进入我的Jenkins服务器以在每次构建后删除容器,因为它具有特定和必要的名称,所以我不能离开它。 如果构建失败,我该如何停止和移动容器?

我的管道:

pipeline {
    agent none
    stages {
        stage('Checkout') {
            agent any
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '<some credentials>', url: '<a git repo>']]])
            }
        }
        stage('Spin Up Receiver') {
            agent any
            steps {
                script { 
                    def receiver = docker.build("receiver",  "--rm centos7_receiver")
                    def receiver_container = receiver.run("-d -v ${PWD}/realtime_files/station_name/201707/f/20170710_191:/DSK1/SSN/LOG0_f/17001 --network='rsync_test' --name='test_receiver'")
                }
            }
        }
        stage('Run Tests') {
            agent { dockerfile { args '-v /etc/passwd:/etc/passwd --network="rsync_test"' } }
            steps {
                sh "python ./rsyncUnitTests.py"
            }
        }
    }
    post {
        always {
            script { 
                receiver_container.stop()
            }
        }
        failure {
            sendEmail('foo@bar.com')
        }
        changed {
            sendEmail('foo@bar.com')
        }
    }
}

2 个答案:

答案 0 :(得分:2)

这是一个有效的解决方案。您只需为容器外部主流水线定义一个变量。然后,您可以在管道中的任何位置使用它来启动或停止容器。特别是,您可以在localStorage.removeItem('AddToFav');

中删除容器
post{ always{ } }

答案 1 :(得分:2)

您可以使用Image.withRun()而不是Image.run()。

  

Image.withRun [(args [,command])] {...}

     

与run一样,但只要它的主体退出就会停止容器,所以你不需要try-finally块。

这里有其他有用的命令: https://qa.nuxeo.org/jenkins/pipeline-syntax/globals#docker