![](/img/trans.png)
[英]How do i deploy a Docker image to a certain Docker container with a 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.