菜单

Docker 集成

相关源文件

本页面描述了 act 如何与 Docker 集成以在容器化环境中运行 GitHub Actions 工作流。Docker 作为 act 的主要执行环境,提供隔离的容器来运行操作和工作流步骤。

有关在非 Docker 环境中运行 act 的信息,请参阅主机环境

概述

Act 依赖 Docker 创建与 GitHub 运行器高度相似的隔离环境。Docker 集成处理容器生命周期管理、镜像操作、文件传输以及容器内的命令执行。

来源:pkg/container/docker_run.go215-238 pkg/container/docker_pull.go19-75 pkg/container/docker_build.go22-72 pkg/container/docker_volume.go13-54 pkg/container/docker_network.go12-79

Docker 客户端连接

Act 通过 Docker Engine API 与 Docker 通信。与 Docker 守护进程的连接通过环境变量(如DOCKER_HOST)建立,并支持本地和远程连接,包括 SSH。

关键组件

  • GetDockerClient():使用环境变量 (DOCKER_HOST) 创建 Docker 客户端
  • SSH 支持:用于安全连接到远程 Docker 守护进程
  • API 版本协商:自动协商兼容的 API 版本

来源:pkg/container/docker_run.go215-238

容器生命周期管理

Act 管理 Docker 容器从创建到删除的整个生命周期。每个容器代表一个作业运行器或一个操作执行环境。

关键容器操作

  1. 创建:使用指定配置创建新容器
  2. 启动:启动已创建的容器
  3. 执行:在运行中的容器内执行命令
  4. 复制:在主机和容器之间传输文件
  5. 移除:移除容器

来源:pkg/container/docker_run.go67-77 pkg/container/docker_run.go79-100 pkg/container/docker_run.go154-161 pkg/container/docker_run.go163-170

容器引用实现

containerReference 结构体是 Docker 容器接口的核心实现。它管理与 Docker 的连接并提供容器操作的方法。

容器引用实现了几个关键方法

  • connect():建立与 Docker 守护进程的连接
  • find():按名称查找现有容器
  • create():创建新容器
  • start():启动容器
  • exec():在容器内运行命令
  • copy()copyDir():将文件复制到/从容器
  • remove():移除容器

来源:pkg/container/docker_run.go206-213 pkg/container/docker_run.go67-170

图像操作

Act 执行多项 Docker 镜像操作,包括从注册表拉取镜像和从 Dockerfile 构建镜像。

镜像拉取

镜像拉取过程会在从注册表拉取之前检查本地是否存在镜像。它支持私有注册表的身份验证。

来源:pkg/container/docker_pull.go19-75 pkg/container/docker_images.go13-34

镜像构建

Act 可以从 Dockerfile 和上下文目录构建 Docker 镜像

来源:pkg/container/docker_build.go22-72 pkg/container/docker_build.go73-118

文件操作

Act 提供在主机和容器之间传输文件的机制。这对于需要访问工作流文件的操作至关重要。

文件复制方法

关键文件操作特性

  • 支持使用 .gitignore 过滤复制目录
  • 处理容器中的权限和所有权
  • 创建 tar 归档以实现高效复制
  • 为复制的文件设置正确的 UID/GID

来源:pkg/container/docker_run.go116-136 pkg/container/docker_run.go701-832

容器配置

Act 通过 NewContainerInput 结构体提供广泛的容器配置选项。

关键配置参数

参数描述
图片要使用的 Docker 镜像
入口点容器入口点
命令要运行的命令
环境变量环境变量
工作目录容器内的工作目录
挂载点卷挂载
绑定挂载绑定挂载
网络模式网络模式(桥接、主机等)
特权模式是否以特权模式运行
暴露端口要暴露的端口
端口绑定端口绑定
网络别名网络别名
选项其他 Docker 选项

配置可以直接提供,也可以通过带有 Options 字段的 Docker 命令行样式选项提供。

来源:pkg/container/docker_run.go352-474

命令执行

Act 在容器内执行命令以运行工作流步骤和操作。执行过程

执行支持

  • 工作目录选择
  • 环境变量注入
  • 用户选择(以特定用户运行)
  • stdout/stderr 流处理
  • 退出代码处理

来源:pkg/container/docker_run.go542-612

网络管理

Act 可以创建和管理 Docker 网络,以实现容器间通信。

网络提供

  • 不同工作流运行之间的隔离
  • 作业容器之间的通信
  • 支持容器 DNS 解析
  • 服务容器的网络别名

来源:pkg/container/docker_network.go12-79

卷管理

Act 管理 Docker 卷以在工作流运行之间持久化数据。

来源:pkg/container/docker_volume.go13-54

Docker 身份验证

Act 支持 Docker 注册表身份验证以拉取私有镜像。

主要身份验证功能

  • 支持用户名/密码身份验证
  • 从 Docker 配置文件加载凭据
  • 支持不同的注册表服务器
  • 身份验证失败的重试机制

来源:pkg/container/docker_auth.go15-61 pkg/container/docker_pull.go77-116

平台支持

Act 支持在不同平台和架构上运行容器

  • 平台规格(例如,linux/amd64, linux/arm64
  • 本地系统架构检测
  • 根据平台要求选择镜像

来源:pkg/container/docker_run.go446-457 pkg/container/docker_run.go259-276

与 Act 运行上下文集成

Docker 集成通过管理工作流执行的 RunContext 连接到更广泛的 Act 系统。

RunContext 包含容器引用并使用它来

  • 执行作业步骤
  • 将工作流文件复制到容器中
  • 为操作设置环境
  • 读取命令输出和操作结果

来源:pkg/container/docker_run.go42-47