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

GitLab CI配置构建推送Docker镜像并部署到AWS EC2故障排查

GitLab CI 配置修复方案

你给出的原始配置核心逻辑是可行的,只要修复几个配置缺陷即可实现Docker镜像构建、推送GitLab Registry、部署到AWS EC2的全流程。

原始配置核心问题

  • tag变量作用域问题:build阶段定义的tag变量仅在当前job生效,deploy阶段无法读取,导致拉镜像时标签匹配错误
  • 依赖工具缺失:deploy阶段未指定镜像,默认runner镜像没有预装ssh客户端、ssh-add等工具,无法执行远程登录逻辑
  • 无用逻辑冗余:after_script中的docker logout执行在runner本地而非EC2实例,完全无效
  • 远程命令变量问题:ssh执行远程命令时未正确传递镜像标签变量,可能导致拉取镜像失败

修复后完整配置

stages:
  - build
  - deploy

build:
  image: docker:latest
  stage: build
  services:
    - docker:dind
  before_script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
  script:
    - |
      if [[ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]]; then
        export IMAGE_TAG="$CI_REGISTRY_IMAGE:latest"
        echo "Running on default branch '$CI_DEFAULT_BRANCH': tag = 'latest'"
      else
        export IMAGE_TAG="$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG"
        echo "Running on branch '$CI_COMMIT_BRANCH': tag = $CI_COMMIT_REF_SLUG"
      fi
    # 把镜像标签写入环境变量传递文件
    - echo "IMAGE_TAG=$IMAGE_TAG" >> build.env
    - docker build --pull -t "$IMAGE_TAG" .
    - docker push "$IMAGE_TAG"
  artifacts:
    reports:
      dotenv: build.env # 声明该文件为跨阶段环境变量传递产物
  rules:
    - if: $CI_COMMIT_BRANCH
      exists:
        - Dockerfile

deploy:
  stage: deploy
  # 指定轻量镜像并预装ssh依赖
  image: alpine:latest
  before_script:
    - apk add --no-cache openssh-client
    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
  script:
    # 远程执行部署命令,直接使用build阶段传递的镜像标签
    - ssh -o StrictHostKeyChecking=no ubuntu@18.0.0.82 "
        echo '$CI_REGISTRY_PASSWORD' | sudo docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY;
        sudo docker pull $IMAGE_TAG;
        cd /home/crud_app;
        sudo docker-compose up -d --force-recreate;
        sudo docker logout $CI_REGISTRY;
      "
  dependencies:
    - build # 声明依赖build阶段产物,获取镜像标签变量
  rules:
    - if: $CI_COMMIT_BRANCH
      exists:
        - Dockerfile

额外配置校验项

  • GitLab项目后台已配置SSH_PRIVATE_KEY变量,对应密钥对的公钥已添加到EC2实例ubuntu用户的~/.ssh/authorized_keys文件中
  • EC2实例安全组已放行GitLab Runner出口IP的22端口访问权限
  • EC2实例的ubuntu用户已配置docker命令sudo免密,或已加入docker用户组(可去掉命令中的sudo避免权限问题)
  • /home/crud_app目录下的docker-compose.yml中引用的镜像名称与推送到GitLab Registry的镜像名称完全匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:24:02