自动化 Docker 部署:使用 GitHub Actions 推送 Image 到 EC2

继上一次后端框架部署完成,这次将我的后端部署到 GitHub Actions,并搭建一个完整的 CI/CD 流程。

1. 资料

Automate Docker Deployments: Push Your Images to EC2 with GitHub Actions

这篇文章详细讲解了如何使用 GitHub Actions 自动化 Docker 部署,并将镜像推送到 EC2 实例,与我的需求很相似,借鉴了很多。

2. 配置 Secret 变量

在 GitHub 仓库中配置一些 Secret 变量,这些变量主要用于身份验证和安全连接。

步骤

Github -> Settings -> Secrets and variables -> Actions -> New repository secret

image-20250127174528568

需要添加的 Secret 变量

image-20250127174557571

  • DOCKERHUB_TOKEN

    • 这个 Token 需要有读写权限,而且生成后只会显示一次,所以一定要记下来。
    • 获取路径:登录 Docker Hub → 点击右上角头像进入 Account SettingsSecurityPersonal Access TokensGenerate new token
  • DOCKERHUB_USERNAME

    • Docker Hub 用户名,通常是邮箱地址。可以运行以下命令来查看:
    1
    docker info | grep Username
  • EC2_USER:根据不同需求选择,我的是ubuntu

    • 根据你的 EC2 实例的 AMI 不同,默认用户名可能不同:
      • 对于 Amazon Linux,默认用户名是 ec2-user
      • 对于 Ubuntu,默认用户名是 ubuntu
  • SSH_PRIVATE_KEY

    • 需要完整复制你的私钥内容,包括 -----BEGIN RSA PRIVATE KEY----------END RSA PRIVATE KEY----- 这些前后缀。

小提示 ⚠️

  • DOCKERHUB_TOKEN 生成后只能看到一次,务必要保存好。
  • SSH_PRIVATE_KEY 一定要包含完整的私钥内容,否则会导致格式错误,无法正常连接。

3. 创建 GitHub Action workflow

新建 Action 文件

  1. 创建 .github/workflows/deploy.yml 文件

    • 在你的仓库根目录下,新建一个文件夹 .github/workflows/,然后在里面创建 deploy.yml 文件。

    • 也可以从这个入口进去创建:

      image-20250127175151195

  2. yml 配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    name: Deploy Docker Image to EC2

    on:
    push:
    branches:
    - main

    jobs:
    deploy:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout repository
    uses: actions/checkout@v2

    - name: Set up Docker Buildx
    uses: docker/setup-buildx-action@v1

    - name: Login to Docker Hub
    uses: docker/login-action@v2
    with:
    username: ${{ secrets.DOCKERHUB_USERNAME }}
    password: ${{ secrets.DOCKERHUB_TOKEN }}

    - name: Build and push Docker image
    run: |
    docker build -t your-docker-image-name .
    docker push your-dockerhub-username/your-docker-image-name:latest

    - name: Install SSH Key
    uses: webfactory/ssh-agent@v0.5.3
    with:
    ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}

    - name: Deploy Docker image to EC2
    run: |
    ssh -o StrictHostKeyChecking=no ${{ secrets.EC2_USER }}@${{ secrets.EC2_INSTANCE_IP }} << 'EOF'
    sudo docker pull your-dockerhub-username/your-docker-image-name:latest
    RUNNING_CONTAINERS=$(sudo docker ps -q)
    sudo docker stop $RUNNING_CONTAINERS
    sudo docker rm $RUNNING_CONTAINERS
    sudo docker compose up -d
    EOF

配置说明

  • 触发条件:当 main 分支有新的提交时,自动触发这个工作流。
  • 步骤
    1. 检出代码:使用 actions/checkout@v2 检出代码库。
    2. 设置 Docker Buildx:配置 Docker 构建环境。
    3. 登录 Docker Hub:使用配置好的 Secret 变量进行身份验证。
    4. 构建并推送 Docker 镜像:构建 Docker 镜像并推送到 Docker Hub。
    5. 部署到 EC2:通过 SSH 连接到 EC2 实例,执行部署脚本。

4. 遇到的报错

  • Docker Token 权限不足

    • 问题:无法将镜像推送到 Docker Hub,提示权限不足。
    • 解决:检查 DOCKERHUB_TOKEN 是否具有读写权限。如果权限不足,重新生成一个具有正确权限的 Token。
  • SSH 私钥格式错误

    • 问题:无法通过 SSH 连接,提示私钥格式错误。
    • 解决:确保在 SSH_PRIVATE_KEY 中包含完整的私钥内容,包括 -----BEGIN RSA PRIVATE KEY----------END RSA PRIVATE KEY-----,不要遗漏任何部分。
  • Ubuntu 中 Docker 运行失败

    • 问题:在 EC2 实例上运行 Docker 命令时失败,提示权限不足。
    • 解决:使用 sudo,比如 docker run修改为sudo docker run`。