【问题标题】:How do I stop a running container in Jenkinsfile?如何停止 Jenkinsfile 中正在运行的容器?
【发布时间】:2020-04-08 11:57:47
【问题描述】:

我有一个 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。谢谢。

【问题讨论】:

    标签: docker jenkins jenkins-pipeline jenkins-docker


    【解决方案1】:

    作为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 这不是一个正确的解决方案,并假设 docker 安装在从站上。
    他引用了jenkinsci/plugins/docker/workflow/Docker.groovy,但是还没有实现Docker类的容器方法。


    2018 年 8 月更新:

    Pieter Vogelaar 在 cmets 中指出“Jenkinsfile Docker pipeline multi stage”,他写道:

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

    它是:

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

    所以这是Declarative Pipeline,开头是:

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

    【讨论】:

    • 谢谢,我使用了更简单的方法。 sh 'docker container rm -f api-server'
    • 这是一个非常糟糕的解决方案。因为您通过外部调用而不是正确的 API 调用来执行它。您还需要安装了 docker 工具并连接到远程 Docker 的 Jenkins slave - 所以您连接了两次。
    • @MichaelA。好的,但在这种情况下,正确的 API 调用是什么?
    • 没有正确的调用。所以没有好的解决办法。我想我们想出我们必须自己为 docker-workflow-plugin 做出贡献。我现在正在调查它...github.com/jenkinsci/docker-workflow-plugin/blob/master/src/…
    • @MichaelA。好的。我已将您的评论包含在答案中以提高知名度。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多