GitLab CI/CD部署后DigitalOcean Docker容器未同步最新代码变更问题求助
解决方案
你的核心问题是部署阶段没有主动拉取最新的镜像——Docker默认会优先使用本地已经存在的同名同标签镜像,哪怕远程仓库里的版本已经更新了。我帮你调整一下deploy阶段的脚本,同时做一些鲁棒性优化:
deploy: stage: deploy before_script: - chmod 400 $SSH_KEY script: - ssh -o StrictHostKeyChecking=no -i $SSH_KEY root@159.89.175.212 " # 登录私有仓库(确保有权限拉取) docker login -u $REGISTRY_USER -p $REGISTRY_PASS && # 关键步骤:拉取最新的镜像 docker pull $IMAGE_NAME:$IMAGE_TAG && # 停止所有运行的容器(没有容器时不报错) docker ps -aq | xargs docker stop || true && # 删除所有停止的容器(没有容器时不报错) docker ps -aq | xargs docker rm || true && # 启动新容器 docker run -d -p 5001:5001 $IMAGE_NAME:$IMAGE_TAG"
为什么之前的脚本不生效?
你原来的deploy脚本里,直接执行docker run命令时,Docker会检查本地是否有$IMAGE_NAME:$IMAGE_TAG这个镜像:
- 如果本地已经存在,就直接用旧版本启动,不会去远程仓库校验更新
- 只有当本地完全没有这个镜像时,才会自动拉取
所以必须显式加上docker pull命令,强制拉取远程仓库的最新版本。
额外优化建议
- 避免脚本中断:原来的
docker ps -aq | xargs docker stop | xargs docker rm如果当前没有运行的容器,xargs会返回错误码导致脚本失败,加上|| true可以忽略这个错误,让脚本继续执行。 - 清理旧镜像:如果要彻底清理本地的旧镜像,可以在pull之后加上
docker image prune -f,但注意这个命令会删除所有悬空(dangling)的镜像,也就是没有标签的旧版本镜像。 - 验证镜像版本:可以在deploy脚本里加上
docker images $IMAGE_NAME来确认拉取的镜像版本是否正确,方便排查问题。
排查步骤(如果修改后仍不生效)
- 检查GitLab CI的环境变量:确认
REGISTRY_USER和REGISTRY_PASS是否正确,拥有私有仓库的拉取权限 - 查看GitLab CI的build阶段日志:确认镜像确实成功推送到了私有仓库
- 在Droplet上手动执行
docker pull $IMAGE_NAME:$IMAGE_TAG:看看是否能拉取到最新镜像,排查网络或权限问题
内容的提问来源于stack exchange,提问作者codelyzer
相关产品推荐
相关产品推荐

