You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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命令,强制拉取远程仓库的最新版本。

额外优化建议

  1. 避免脚本中断:原来的docker ps -aq | xargs docker stop | xargs docker rm如果当前没有运行的容器,xargs会返回错误码导致脚本失败,加上|| true可以忽略这个错误,让脚本继续执行。
  2. 清理旧镜像:如果要彻底清理本地的旧镜像,可以在pull之后加上docker image prune -f,但注意这个命令会删除所有悬空(dangling)的镜像,也就是没有标签的旧版本镜像。
  3. 验证镜像版本:可以在deploy脚本里加上docker images $IMAGE_NAME来确认拉取的镜像版本是否正确,方便排查问题。

排查步骤(如果修改后仍不生效)

  • 检查GitLab CI的环境变量:确认REGISTRY_USER和REGISTRY_PASS是否正确,拥有私有仓库的拉取权限
  • 查看GitLab CI的build阶段日志:确认镜像确实成功推送到了私有仓库
  • 在Droplet上手动执行docker pull $IMAGE_NAME:$IMAGE_TAG:看看是否能拉取到最新镜像,排查网络或权限问题

内容的提问来源于stack exchange,提问作者codelyzer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 00:17:41