GitHub Actions 不直接支持将自定义 Docker 镜像作为 job 运行环境(如 runs-on),但可通过自托管 runner 实现该高级用法;更常用的是在 workflow 中构建、推送并验证自定义镜像,或使用 container 指令为单个 step 临时指定镜像。

GitHub Actions 本身不直接“集成”自定义 Docker 镜像作为运行环境(比如像用 runs-on: ubuntu-latest 那样),但它能构建、测试、推送并复用你自己的镜像——关键在于区分两种角色:镜像作为执行环境(runner) vs. 镜像作为构建产物或部署目标。绝大多数场景下,你是在后者上下功夫。
用自定义镜像作为 job 的运行环境(高级但少见)
GitHub Actions 原生只支持官方托管的 runner(ubuntu/macOS/windows)和自托管 runner。若真想让某个 job 在你自己的镜像里运行,必须自托管 runner**,并在该机器上预装好你的镜像,并配置 runner 启动时以它为默认容器。这不是在 workflow YAML 里写一句就能生效的,而是基础设施层面的操作:
- 准备一台 Linux 服务器或虚拟机,安装 Docker 和 GitHub Actions runner
- 提前
docker pull your-registry/your-image:tag或docker build -t your-image . - 修改 runner 的
.env或启动脚本,使其在执行 job 时通过docker run --rm -v ... your-image:tag调用你的镜像 - workflow 中仍写
runs-on: self-hosted,实际执行由你控制的容器完成
⚠️ 注意:这会失去 GitHub 托管 runner 的自动扩缩、安全隔离和免运维优势,仅适合有强定制化需求(如专用硬件、内网工具链、合规沙箱)的团队。
更常用:在 workflow 中构建并推送你的自定义镜像
这是标准做法——把你的 Dockerfile 放进仓库,在 Actions 里自动构建、打标、推送到 Docker Hub / GitHub Packages / 私有 registry:
- 确保仓库根目录有
Dockerfile和所需上下文文件(如app.py、package.json) - 在
.github/workflows/build.yml中使用docker/setup-buildx-action启用 BuildKit 支持多平台和缓存 - 用
docker/login-action登录目标 registry(用户名/密码存为secrets.DOCKER_USERNAME等) - 用
docker/build-push-action一次性构建 + 推送,支持自动打多个 tag(如latest、${{ github.sha }}、v1.2.0)
示例关键步骤片段:
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: |
yourname/myapp:${{ github.sha }}
yourname/myapp:latest
在 workflow 中拉取并运行你的自定义镜像(用于测试或部署)
构建完镜像后,你可以在后续 job 中把它当“工具”来用。比如验证镜像是否能正常启动:
- 添加一个新 job,
runs-on: ubuntu-latest - 用
docker pull your-registry/your-image:tag拉取 - 用
docker run --rm your-image:tag your-test-command执行健康检查或集成测试 - 也可配合
docker compose up -d启动依赖服务再测试
这种用法清晰分离了“构建镜像”和“验证镜像”两个阶段,符合 CI 最佳实践。
小技巧:用 container 指令临时切换 step 运行环境
虽然不能全局换 runner,但单个 step 可以指定 container —— GitHub Actions 会自动拉取该镜像并在此容器中执行该 step 的 shell 命令:
- 适用于需要特定 CLI 工具的 step(比如用
curlimages/curl发请求,或用python:3.11-slim运行脚本) - 写法:
container: your-registry/your-image:tag放在 step 下 - 注意:该容器必须能运行
/bin/sh -e,且工作目录、网络、挂载卷需额外配置(用options字段)
这个能力轻量灵活,适合“借镜像一用”,不涉及构建或推送逻辑。


















