4

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

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。谢谢。

4

2 回答 2

11

就像在这个 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.在评论中指出这不是一个合适的解决方案,并假设 docker 安装在从站上。
他指的是,但尚未实现该类jenkinsci/plugins/docker/workflow/Docker.groovy的容器方法。Docker


2018 年 8 月更新:

Pieter Vogelaar在对“ Jenkinsfile Docker pipeline multi stage ”的评论中指出:

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

这是:

pipelineContextLinkedHashMap 类型的全局变量。
Jenkinsfile 编程语言是 Groovy。在 Groovy 中,这接近于 JavaScript 对象的等价物。这个变量使得在阶段之间共享数据或对象成为可能。

所以这是一个声明式管道,从:

// Initialize a LinkedHashMap / object to share between stages
def pipelineContext = [:]
于 2017-12-16T06:56:25.363 回答
0

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

于 2018-07-31T12:20:37.093 回答