作业容器是什么
作业容器(jobs 下的 container)让 GitHub Actions 作业在指定容器里运行:镜像里预装好工具链,步骤用 uses 与 run 照常写,环境与宿主解耦、版本随镜像固定。容器内 run 的默认 shell 变为 sh,宿主与容器的路径和工作目录差异是最常见的坑;配套 services 可以在旁路拉起数据库等依赖服务。
基本信息
| 写法 | container 指定 image 与 options |
|---|---|
| 步骤 | 仍可 uses 与 run;run 的默认 shell 是 sh |
| 配套 | services 提供数据库等旁路服务 |
| 收益 | 工具链版本可复现,摆脱宿主环境漂移 |
| 要求 | 镜像内要有作业需要的基础工具 |
| 网络 | 步骤与 services 在同一网络内互通 |
| 路径 | 用 GITHUB_WORKSPACE 引用挂载的工作目录 |
| 用户 | 容器使用镜像默认用户,注意与宿主权限的差异 |
容器中构建
容器中构建
jobs:
build:
runs-on: ubuntu-latest
container:
image: node:22-bookworm # 固定 Node 版本
services:
db:
image: postgres:16 # 旁路数据库
env:
POSTGRES_PASSWORD: test # 测试用口令
steps:
- uses: actions/checkout@v4
- run: npm ci && npm test # 容器内执行典型使用场景
- 固定工具链:Node、Python、Java 版本写进镜像,构建可复现
- 依赖服务:services 拉起数据库与缓存做集成测试
- 多版本验证:矩阵搭配不同镜像组合
- 摆脱宿主:宿主运行器不再需要预装复杂环境
- 隔离构建:容器内权限模型与宿主隔离
- 老旧项目:把过时构建环境封进镜像继续使用
- 本地复现:用同一镜像在本地跑脚本,缩小排查范围
常见差异与处理
| 差异 | 处理 |
|---|---|
| 默认 shell | 容器内 run 默认 sh,脚本要兼容或显式指定 bash |
| 路径 | 工作目录挂载点不同,用 GITHUB_WORKSPACE 引用 |
| 权限 | 容器用户与宿主 UID 差异,用 options 调整 |
| 工具缺失 | 镜像里没有的工具按需补装 |
| 服务连通 | services 通过服务名访问,不要写 localhost |
把工具链版本写进镜像:比每次在宿主上安装更稳定。
宿主与容器路径差异:挂载目录权限问题常见,必要时用 options 调整。
镜像缺工具导致步骤内临时安装:每次拉取耗时且引入漂移。
容器镜像打固定版本:latest 漂移会破坏可复现性。
调试容器作业先在本地用同一镜像跑一遍脚本:能提前发现缺工具与路径问题。