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

GitLab CI/CD流水线执行成功但服务器代码未更新的修复方案

GitLab流水线执行成功但服务器代码未更新的排查与解决

核心排查方向

1. 镜像构建与推送是否正常

  • 检查build_and_push阶段日志,确认docker build和docker push命令执行成功,且使用的$IMAGE_NAME标签正确。若使用latest标签,Docker可能会缓存本地镜像,导致docker-compose pull不会拉取新镜像。
  • 建议使用唯一标签(如Git提交哈希),避免缓存问题。

2. Docker Compose拉取镜像是否生效

  • 查看deploy阶段的docker-compose pull日志,确认是否拉取了新镜像。若用latest标签,可添加--pull always强制拉取最新版本。
  • 检查服务器上的docker-compose.yml是否与仓库同步,确保image字段引用的是正确的镜像地址。

3. 命名卷覆盖容器代码(关键问题)

你的web-app服务配置了volumes: - app:/app,Docker命名卷的特性是:首次启动时会将镜像内/app目录的内容复制到卷中,之后即使镜像更新,卷内的旧内容会覆盖镜像里的新代码,导致服务器代码无变化。

4. 容器是否重新创建

  • 查看docker-compose down和up -d的日志,确认容器是否被完全停止并重新创建,而非仅重启旧容器。若容器未重建,会继续使用旧镜像层。

具体解决步骤

1. 修复命名卷覆盖问题

如果应用不需要持久化整个/app目录(如Django项目代码应打包在镜像内),直接删除以下配置:

volumes:
  - app:/app

若需持久化/app下的子目录(如media、static),仅挂载指定目录:

volumes:
  - app:/app/media
  - app:/app/static

2. 使用唯一镜像标签避免缓存

修改gitlab-ci.yml的build_and_push阶段,用Git提交哈希作为镜像标签:

build_and_push:
  image: docker:stable
  stage: publish
  script:
    - docker system prune -a -f
    - TAG=$CI_COMMIT_SHORT_SHA
    - docker build -t $IMAGE_NAME:$TAG .
    - docker login $REGISTRY -u $REGISTRY_USER -p $REGISTRY_TOKEN
    - docker push $IMAGE_NAME:$TAG
    - echo "IMAGE_TAG=$TAG" > build.env
  artifacts:
    reports:
      dotenv: build.env
  only:
    - main

修改deploy阶段,传递唯一标签到服务器:

deploy:
  image: ubuntu
  stage: deploy
  script:
    - chmod og= $SSH_KEY
    - apt-get update && apt-get install openssh-client -y
    - ssh -i $SSH_KEY -o StrictHostKeyChecking=no $USER@$HOST docker login $REGISTRY -u $REGISTRY_USER -p $REGISTRY_TOKEN
    - ssh -i $SSH_KEY -o StrictHostKeyChecking=no $USER@$HOST "IMAGE_NAME=$IMAGE_NAME IMAGE_TAG=$IMAGE_TAG docker-compose pull"
    - ssh -i $SSH_KEY -o StrictHostKeyChecking=no $USER@$HOST "IMAGE_NAME=$IMAGE_NAME IMAGE_TAG=$IMAGE_TAG docker-compose down"
    - ssh -i $SSH_KEY -o StrictHostKeyChecking=no $USER@$HOST "IMAGE_NAME=$IMAGE_NAME IMAGE_TAG=$IMAGE_TAG docker-compose up -d"
  environment:
    name: production
    url: http://192.168.0.130
  only:
    - main

同步修改docker-compose.yml的image字段:

image: ${IMAGE_NAME}:${IMAGE_TAG}

3. 验证修复结果

  • 查看GitLab流水线日志,确认镜像标签为当前提交哈希且推送成功。
  • 在服务器执行docker images,确认新镜像已拉取。
  • 执行docker-compose ps,确认web-app容器使用新镜像启动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 14:25:22