如何在Jenkinsfile中停止正在运行的容器?

时间:2017-12-16 03:23:20

标签: docker jenkins jenkins-pipeline jenkins-docker

我有一个Jenkinsfile或Jenkins管道,它创建一个新图像并从该图像中启动一个容器。它第一次运作良好。但是在后续运行中,我希望停止并删除前一个容器。我的Jenkins文件如下:

node {
   def commit_id
   stage('Preparation') {
     checkout scm
     sh "git rev-parse --short HEAD > .git/commit-id"                        
     commit_id = readFile('.git/commit-id').trim()
   }
   stage('docker build/push') {
     docker.withRegistry('https://index.docker.io/v1/', 'dockerhub') {
       def app = docker.build("my-docker-id/my-api:${commit_id}", '.').push()
     }
   }
   stage('docker stop container') {
       def apiContainer = docker.container('api-server')
       apiContainer.stop()
   }
   stage('docker run container') {
       def apiContainer = docker.image("my-docker-id/my-api:${commit_id}").run("--name api-server --link mysql_server:mysql --publish 3100:3100")
   }
}

舞台'docker stop container'失败了。那是因为我不知道正确的API来获取容器并阻止它。感谢。

2 个答案:

答案 0 :(得分:8)

作为in this Jenkinsfile,您可以使用sh命令。

这样,您可以使用以下行:

sh 'docker ps -f name=zookeeper -q | xargs --no-run-if-empty docker container stop'
sh 'docker container ls -a -fname=zookeeper -q | xargs -r docker container rm'

这将确保容器x(此处名为zookeper)(如果它正在运行)首先停止并移除。

Michael A.指出in the comments这不是一个正确的解决方案,并假设在奴隶上安装了泊坞广告。
他引用jenkinsci/plugins/docker/workflow/Docker.groovy,但Docker类的容器方法尚未实现。

2018年8月更新:

Pieter Vogelaar在评论中指出" Jenkinsfile Docker pipeline multi stage"他写道:

  

通过使用全局pipelineContext对象,可以在更进一步的阶段使用返回的容器对象。

是:

  

pipelineContext全局变量,其类型为LinkedHashMap   Jenkinsfile编程语言是Groovy。在Groovy中,这接近于JavaScript对象的等价物。此变量可以在各阶段之间共享数据或对象。

所以这是一个Declarative Pipeline,从:

开始
// Initialize a LinkedHashMap / object to share between stages
def pipelineContext = [:]

答案 1 :(得分:0)

通过使用全局pipelineContext对象,可以在进一步的阶段中使用返回的容器对象。或者例如在必须始终执行的后期构建步骤中,对于失败的构建也是如此。这样,Docker容器始终在构建结束时就停止并删除。我在http://pietervogelaar.nl/jenkinsfile-docker-pipeline-multi-stage中描述了一个可行的解决方案。