Jenkins 在詹金斯阻止Docker集装箱的最佳方法

Jenkins 在詹金斯阻止Docker集装箱的最佳方法,jenkins,docker,Jenkins,Docker,我有一个CI服务器(jenkins),它正在构建新的Docker映像。 现在我想在构建成功后运行一个新的Docker容器。 但因此,我必须停止之前运行的容器 执行此操作的最佳方式是什么? localhost:5000/test/myapp:“${BUILD\u ID}是我的新映像的名称。因此我使用BUILD ID作为标记。首先我想执行: docker stop localhost:5000/dbm/my-php-app:${BUILD_ID-1} 但这不是一个正确的解决方案,因为当构建失败时,

我有一个CI服务器(jenkins),它正在构建新的Docker映像。 现在我想在构建成功后运行一个新的Docker容器。 但因此,我必须停止之前运行的容器

执行此操作的最佳方式是什么?
localhost:5000/test/myapp:“${BUILD\u 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)
什么是解决方案?我必须更改标记想法的建议也是受欢迎的

该命令将docker容器名称作为参数,而不是docker图像ID

您必须在运行容器时为其命名:

#构建新映像
docker build-t localhost:5000/test/myapp:“${build\u ID}”。
#移除现有容器
docker rm-f myjob&&echo“容器myjob已删除”| | echo“容器myjob不存在”
#创建并运行一个新容器
docker run-d——名称myjob localhost:5000/test/myapp:“${BUILD_ID}”

在本例中,只需用更合适的名称替换
myjob

多亏了@thomaslevel,我找到了问题的答案:

# 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}

如果您正在使用Jenkins管道,并且想要优雅地停止并移除容器,那么以下是解决方案

首先,您必须检查是否存在任何容器,如果存在任何容器,则必须停止并删除它

def doc_containers=sh(returnStdout:true,脚本:'docker container ps-aq')。replaceAll(“\n”,”)
if(文件容器){
sh“docker stop${doc_containers}”
}
变量
doc\u containers
将存储容器ID,您可以执行空检查。如果容器不可用,则不应执行
docker stop
命令

这是管道代码

stage('Clean docker containers'){
台阶{
剧本{
def doc_containers=sh(returnStdout:true,脚本:'docker container ps-aq')。replaceAll(“\n”,”)
if(文件容器){
sh“docker stop${doc_containers}”
}
}
}
}