簡體   English   中英

如何在 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 來獲取容器並停止它。 謝謝。

就像在這個 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 管道多階段”的評論中指出,他寫道:

通過使用全局pipelineContext對象,可以在進一步的階段使用返回的容器對象。

這是:

類型為 LinkedHashMap 的pipelineContext全局變量。
Jenkinsfile 編程語言是 Groovy。 在 Groovy 中,這接近於 JavaScript 對象的等價物。 該變量使得在階段之間共享數據或對象成為可能。

所以這是一個聲明性 Pipeline ,從:

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

通過使用全局 pipelineContext 對象,可以在進一步的階段使用返回的容器對象。 或者例如在必須始終執行的后期構建步驟中,對於失敗的構建也是如此。 這樣 Docker 容器總是在構建結束時停止和刪除。 我在http://pietervogelaar.nl/jenkinsfile-docker-pipeline-multi-stage描述了一個工作解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM