继上一次后端框架部署完成,这次将我的后端部署到 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

需要添加的 Secret 变量

DOCKERHUB_TOKEN:
- 这个 Token 需要有读写权限,而且生成后只会显示一次,所以一定要记下来。
- 获取路径:登录 Docker Hub → 点击右上角头像进入
Account Settings→Security→Personal Access Tokens→Generate new token。
DOCKERHUB_USERNAME:
- Docker Hub 用户名,通常是邮箱地址。可以运行以下命令来查看:
1
docker info | grep Username
EC2_USER:根据不同需求选择,我的是
ubuntu- 根据你的 EC2 实例的 AMI 不同,默认用户名可能不同:
- 对于 Amazon Linux,默认用户名是
ec2-user。 - 对于 Ubuntu,默认用户名是
ubuntu。
- 对于 Amazon Linux,默认用户名是
- 根据你的 EC2 实例的 AMI 不同,默认用户名可能不同:
SSH_PRIVATE_KEY:
- 需要完整复制你的私钥内容,包括
-----BEGIN RSA PRIVATE KEY-----和-----END RSA PRIVATE KEY-----这些前后缀。
- 需要完整复制你的私钥内容,包括
小提示 ⚠️:
- DOCKERHUB_TOKEN 生成后只能看到一次,务必要保存好。
- SSH_PRIVATE_KEY 一定要包含完整的私钥内容,否则会导致格式错误,无法正常连接。
3. 创建 GitHub Action workflow
新建 Action 文件
创建
.github/workflows/deploy.yml文件:在你的仓库根目录下,新建一个文件夹
.github/workflows/,然后在里面创建deploy.yml文件。也可以从这个入口进去创建:

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
43name: 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分支有新的提交时,自动触发这个工作流。 - 步骤
- 检出代码:使用
actions/checkout@v2检出代码库。 - 设置 Docker Buildx:配置 Docker 构建环境。
- 登录 Docker Hub:使用配置好的 Secret 变量进行身份验证。
- 构建并推送 Docker 镜像:构建 Docker 镜像并推送到 Docker Hub。
- 部署到 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`。