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
相关产品推荐
相关产品推荐

