GitLab流水线部署Docker至EC2:实现容器存在则停止否则无操作
解决方案
问题根源在于:当EC2实例上没有任何Docker容器时,docker ps -aq返回空结果,xargs会直接执行docker stop和docker rm命令但不传递任何容器ID参数,触发"缺少参数"的报错。
下面提供两种无需知晓镜像名称的解决办法:
方法一:利用xargs的空输入跳过执行
给xargs添加--no-run-if-empty(简写-r)参数,当管道输入为空时,xargs会跳过后续命令的执行,避免报错。
修改后的GitLab流水线配置:
deploy: stage: deploy before_script: - chmod 400 $SSH_KEY script: ssh -o StrictHostKeyChecking=no -i $SSH_KEY ec2-user@ecxxxxx-xxxx.ap-southeast-1.compute.amazonaws.com " docker login -u $REGISTRY_USER -p $REGISTRY_PASS && docker ps -aq | xargs -r docker stop | xargs -r docker rm && docker run -d -p 5000:5000 $IMAGE_NAME:$IMAGE_TAG"
方法二:用Shell条件判断控制执行逻辑
先捕获所有容器ID,判断是否存在非空值,再执行停止和删除操作,逻辑更直观。
修改后的GitLab流水线配置:
deploy: stage: deploy before_script: - chmod 400 $SSH_KEY script: ssh -o StrictHostKeyChecking=no -i $SSH_KEY ec2-user@ecxxxxx-xxxx.ap-southeast-1.compute.amazonaws.com " docker login -u $REGISTRY_USER -p $REGISTRY_PASS && CONTAINER_IDS=\$(docker ps -aq); if [ -n \"\$CONTAINER_IDS\" ]; then docker stop \$CONTAINER_IDS && docker rm \$CONTAINER_IDS; fi && docker run -d -p 5000:5000 $IMAGE_NAME:$IMAGE_TAG"
注意:这里需要对变量$CONTAINER_IDS和引号进行转义(\$、\"),避免SSH执行时被本地Shell解析。
内容的提问来源于stack exchange,提问作者Jatin Mehrotra
相关产品推荐
相关产品推荐

