我有一个CI服务器(jenkins)正在构建新的Docker镜像。 现在我想在构建成功时运行一个新的Docker容器。 但是因此我必须停止以前运行的容器。
执行此操作的最佳方式是什么?
localhost:5000/test/myapp:"${BUILD_ID}
是我的新图片的名称。所以我使用build-id作为标记。首先我想要表演:
docker stop localhost:5000/dbm/my-php-app:${BUILD_ID-1}
但这不是一个正确的解决方案,因为当构建失败时,这将是错误的。
Build 1: succes -> run container 1
Build 2: failed -> run container 1
Build 3: succes -> stop container (3-1) =2 --> wrong (isn't running)
什么是解决方案?我也不得不改变标签的建议
答案 0 :(得分:6)
docker stop
命令将 docker容器名称作为参数,而不是 docker image ID 。
您必须在运行时为容器命名:
# build the new image
docker build -t localhost:5000/test/myapp:"${BUILD_ID}" .
# remove the existing container
docker rm -f myjob && echo "container myjob removed" || echo "container myjob does not exist"
# create and run a new container
docker run -d --name myjob localhost:5000/test/myapp:"${BUILD_ID}"
在此示例中,只需将myjob
替换为更合适的名称。
答案 1 :(得分:5)
感谢@Thomasleveil,我在我的问题上找到了答案:
# build the new image
docker build -t localhost:5000/test/myapp:"${BUILD_ID}" .
# remove old container
SUCCESS_BUILD=`wget -qO- http://jenkins_url:8080/job/jobname/lastSuccessfulBuild/buildNumber`
docker rm -f "${SUCCESS_BUILD}" && echo "container ${SUCCESS_BUILD} removed" || echo "container ${SUCCESS_BUILD} does not exist"
# run new container
docker run -d -p 80:80 --name "${BUILD_ID}" localhost:5000/test/myapp:${version}
答案 2 :(得分:0)
如果您正在使用 Jenkins Pipeline 并希望优雅地停止和移除容器,那么这里是解决方案。
首先,您必须检查是否存在任何容器,如果有,则必须停止并移除它。这是代码
def doc_containers = sh(returnStdout: true, script: 'docker container ps -aq').replaceAll("\n", " ")
if (doc_containers) {
sh "docker stop ${doc_containers}"
}
变量 doc_containers
将存储容器 ID,您可以执行空检查。如果容器不可用,则不应执行 docker stop
命令。
这是管道代码
stage('Clean docker containers'){
steps{
script{
def doc_containers = sh(returnStdout: true, script: 'docker container ps -aq').replaceAll("\n", " ")
if (doc_containers) {
sh "docker stop ${doc_containers}"
}
}
}
}