构建推送镜像
docker/build-push-action、GHCR、标签策略。
构建推送镜像
这一课你将能做到
- 写出使用
docker/login-action+docker/build-push-action的 job,把镜像推到 GHCR(ghcr.io) - 配置推包所需的
permissions: packages: write,并用github.sha/latest说明 tag 策略的取舍 - 结合仓库已有的
backend/Dockerfile、platform/Dockerfile,说明 CI 镜像构建与本地docker build的关系
为什么要学
测绿了还不够:K8s / Compose / 单机 Docker 跑的是镜像,不是 runner 上的临时目录。CI 负责「从 Dockerfile 构建并推到镜像仓库」,部署侧才有稳定可拉的引用。
GitHub 生态里 GHCR 与仓库同账号:常用 GITHUB_TOKEN 登录,少维护一套 Docker Hub 密码(仍要管好权限与可见性)。
本课聚焦 build-push;「谁把新 tag 写进集群」交给下一课部署策略。
先建立图像
CI(已测过,或同一流水线里 needs: [测试] 的后续 job)
checkout
docker login ghcr.io(用 GITHUB_TOKEN)
docker build(context: backend 或 platform)
docker push
└─ ghcr.io/<owner>/coderoadmap-backend:<sha>
└─ ghcr.io/<owner>/coderoadmap-backend:latest (可选)
之后
Helm values 的 image.tag = <sha>,或 Compose image: …:<sha>
人话:镜像是打包好的「可运行盒饭」;GHCR 是食堂冰箱。CI 负责炒好推进冰箱,部署侧负责写「今天吃哪一盒」的标签。
| Tag 策略 | 用途 | 注意 |
|---|---|---|
完整 github.sha | 每次 commit 可追溯 | 名字长,回滚最精确 |
| 短 sha(7 位) | 好读 | 仍建议保留完整 sha 可查 |
semver 1.2.3 | 正式发布 | 需要发布流程配合 |
latest | 方便试玩 | 可变,生产慎用 |
跟着做
步骤 1:本地先验证 Dockerfile
# 在仓库根,按项目文档构建
docker build -t coderoadmap-backend:local ./backend
# 若有 platform Dockerfile:
docker build -t coderoadmap-platform:local ./platform
本地构建失败,不要指望 Actions 变绿。记下 build context 目录与是否需要 build-args。
步骤 2:写 backend 推送 job
name: Docker
on:
push:
branches: [main]
workflow_dispatch:
permissions:
contents: read
packages: write # 推 GHCR 必需
jobs:
docker-backend:
runs-on: ubuntu-latest
steps:
- name: 拉取代码
uses: actions/checkout@v4
- name: 登录 GHCR
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
# 内置 token;配合 packages: write
password: ${{ secrets.GITHUB_TOKEN }}
- name: 构建并推送
uses: docker/build-push-action@v6
with:
context: backend
push: true
tags: |
ghcr.io/${{ github.repository_owner }}/coderoadmap-backend:${{ github.sha }}
ghcr.io/${{ github.repository_owner }}/coderoadmap-backend:latest