act 项目中的容器系统提供了一个健壮的抽象层,用于创建、管理和与容器交互。该系统主要负责在容器化环境中执行 GitHub Actions 工作流程,处理容器生命周期操作、文件传输、命令执行和环境设置。
本页面重点介绍核心容器管理组件。有关 Docker 集成详情,请参阅 Docker 集成;有关不使用 Docker 运行操作的信息,请参阅 主机环境。
容器系统围绕几个关键接口和实现构建,这些接口和实现提供了一个超越特定容器技术的抽象层。
来源:pkg/container/container_types.go10-85 pkg/container/docker_run.go206-213 pkg/container/host_environment.go28-36
容器系统以 Container 接口为中心,该接口定义了可在容器上执行的标准操作。
每个方法都返回一个 common.Executor,这是一个执行操作的函数,允许操作的组合和延迟执行。
来源:pkg/container/container_types.go43-58
act 系统主要通过两种方式实现 Container 接口:
这种双重实现方法提供了灵活性,允许用户使用或不使用 Docker 运行 GitHub Actions。
containerReference 结构体为 Docker 容器实现了 Container 接口。
它通过 Docker API 客户端管理 Docker 容器,并提供 GitHub Actions 执行所需的所有功能。
来源:pkg/container/docker_run.go206-213
HostEnvironment 结构体提供了 Container 接口的一个无需 Docker 的实现。
此实现直接在主机系统上执行命令,而不是在容器中执行,因此适用于没有 Docker 的环境。
来源:pkg/container/host_environment.go28-36
容器系统为 GitHub Actions 执行中使用的容器提供完整的生命周期管理。
来源:pkg/container/docker_run.go42-47 pkg/container/docker_run.go67-170 pkg/container/host_environment.go38-470
容器系统通过 NewContainerInput 结构体支持灵活的容器创建,并提供多种配置选项。
来源:pkg/container/container_types.go11-33
容器创建遵循以下步骤:
来源:pkg/container/docker_run.go67-100
容器系统提供了一个健壮的机制,用于在容器内执行命令。
来源:pkg/container/docker_run.go542-613
执行过程:
Exec() 方法在容器中创建一个执行实例。容器系统提供全面的文件操作,用于在主机和容器之间传输文件。
文件操作有多种方法:
来源:pkg/container/docker_run.go116-144 pkg/container/docker_run.go730-798 pkg/container/docker_run.go801-832
该系统提供容器的健康检查功能,这对于工作流程在使用服务容器之前需要确保其健康状态的服务容器尤其有用。
来源:pkg/container/docker_run.go172-194 pkg/container/container_types.go78-84
健康状态包括:
这在 GitHub Actions 服务容器中得到利用,以确保服务在运行工作流程步骤之前就绪。
容器系统通过 NewContainerInput 结构体中的 Platform 字段支持不同的 Docker 平台。这允许指定操作系统和架构的组合(例如,linux/amd64,linux/arm64)。
该系统还会检测 Docker API 版本,以确定是否支持平台规范。
来源:pkg/container/docker_run.go49-65 pkg/container/docker_run.go446-456
容器系统还提供与 GitHub Actions 上下文兼容的运行器架构信息。
这将 Docker 架构名称映射到 GitHub Actions 运行器架构名称,确保与检查运行器架构的 GitHub Actions 兼容。
来源:pkg/container/docker_run.go259-276
容器系统在 act 项目中提供了一个关键的抽象层,使得 GitHub Actions 工作流程能够在高度模仿 GitHub 自身运行器环境的受控环境中执行。通过同时支持基于 Docker 和基于主机的执行环境,它为不同的用户需求和环境提供了灵活性。
主要功能包括
这个抽象层使得 act 代码库的其余部分能够以一致的方式与容器交互,无论它们是 Docker 容器还是本地环境。