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

How do I stop a running container in Jenkinsfile?

我有一个 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 来获取容器并停止它。谢谢

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. points out 这不是一个合适的解决方案,假设 docker 安装在从机上。
他提到 jenkinsci/plugins/docker/workflow/Docker.groovy,但是 Docker class 的容器方法尚未实现。


2018 年 8 月更新:

Pieter Vogelaar points out in the comments to "Jenkinsfile Docker pipeline multi stage”他写道:

By using a global pipelineContext object, it's possible to use the returned container object in a further stage.

是:

pipelineContext global variable which is of type LinkedHashMap.
The Jenkinsfile programming language is Groovy. In the Groovy this comes close to the equivalent of the JavaScript object. This variable makes it possible to share data or objects between stages.

所以这是一个 Declarative Pipeline,开头为:

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

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

描述了一个可行的解决方案