配置你的 GitHub Actions 构建器

本页面包含使用我们的 Setup Buildx Action 时配置 BuildKit 实例的说明。

版本固定

默认情况下,该操作将尝试使用 GitHub Runner 上可用的最新版本的 Buildx(构建客户端)和最新版本的 BuildKit(构建服务器)。

要固定到特定版本的 Buildx,请使用 version 输入。例如,固定到 Buildx v0.10.0

- name: Set up Docker Buildx
  uses: docker/setup-buildx-action@v3
  with:
    version: v0.10.0

要固定到特定版本的 BuildKit,请在 driver-opts 输入中使用 image 选项。例如,固定到 BuildKit v0.11.0

- name: Set up Docker Buildx
  uses: docker/setup-buildx-action@v3
  with:
    driver-opts: image=moby/buildkit:v0.11.0

BuildKit 容器日志

要在使用 docker-container 驱动程序时显示 BuildKit 容器日志,您必须启用步骤调试日志,或者在 Docker Setup Buildx 操作中设置 --debug buildkitd 标志

name: ci

on:
  push:

jobs:
  buildx:
    runs-on: ubuntu-latest
    steps:
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
        with:
          buildkitd-flags: --debug
      
      - name: Build
        uses: docker/build-push-action@v6

日志将在作业结束时可用

BuildKit container logs

BuildKit 守护程序配置

如果您使用 docker-container 驱动程序(默认),可以使用 configbuildkitd-config-inline 输入向构建器提供 BuildKit 配置

注册表镜像

您可以使用 buildkitd-config-inline 输入直接在工作流中使用内联块配置注册表镜像

name: ci

on:
  push:

jobs:
  buildx:
    runs-on: ubuntu-latest
    steps:
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
        with:
          buildkitd-config-inline: |
            [registry."docker.io"]
              mirrors = ["mirror.gcr.io"]

有关使用注册表镜像的更多信息,请参阅注册表镜像

最大并行度

您可以限制 BuildKit 求解器的并行度,这对于低功耗机器特别有用。

您可以使用 buildkitd-config-inline 输入(如前面的示例),或者如果您愿意,可以使用存储库中的专用 BuildKit 配置文件作为 config 输入

# .github/buildkitd.toml
[worker.oci]
  max-parallelism = 4
name: ci

on:
  push:

jobs:
  buildx:
    runs-on: ubuntu-latest
    steps:
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
        with:
          config: .github/buildkitd.toml

向构建器添加额外的节点

Buildx 支持在多台机器上运行构建。这对于在原生节点上构建多平台镜像非常有用,可以处理 QEMU 无法处理的更复杂情况。在原生节点上构建通常性能更好,并允许您将构建分布到多台机器上。

您可以使用 append 选项向正在创建的构建器添加节点。它以 YAML 字符串文档的形式接收输入,以消除与 GitHub Actions 内在关联的限制:您只能在输入字段中使用字符串

名称类型描述
name字符串节点的名称。如果为空,则为它所属的构建器的名称,带有索引数字后缀。如果您想在工作流的后续步骤中修改/删除节点,设置此值会很有用。
端点字符串要添加到构建器的节点的Docker 上下文或端点
driver-opts列表额外的特定于驱动程序的选项列表
buildkitd-flags字符串buildkitd 守护程序的标志
platforms字符串节点的固定平台。如果不为空,则值优先于检测到的值。

以下是使用remote 驱动程序TLS 身份验证的远程节点的示例

name: ci

on:
  push:

jobs:
  buildx:
    runs-on: ubuntu-latest
    steps:
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
        with:
          driver: remote
          endpoint: tcp://oneprovider:1234
          append: |
            - endpoint: tcp://graviton2:1234
              platforms: linux/arm64
            - endpoint: tcp://linuxone:1234
              platforms: linux/s390x
        env:
          BUILDER_NODE_0_AUTH_TLS_CACERT: ${{ secrets.ONEPROVIDER_CA }}
          BUILDER_NODE_0_AUTH_TLS_CERT: ${{ secrets.ONEPROVIDER_CERT }}
          BUILDER_NODE_0_AUTH_TLS_KEY: ${{ secrets.ONEPROVIDER_KEY }}
          BUILDER_NODE_1_AUTH_TLS_CACERT: ${{ secrets.GRAVITON2_CA }}
          BUILDER_NODE_1_AUTH_TLS_CERT: ${{ secrets.GRAVITON2_CERT }}
          BUILDER_NODE_1_AUTH_TLS_KEY: ${{ secrets.GRAVITON2_KEY }}
          BUILDER_NODE_2_AUTH_TLS_CACERT: ${{ secrets.LINUXONE_CA }}
          BUILDER_NODE_2_AUTH_TLS_CERT: ${{ secrets.LINUXONE_CERT }}
          BUILDER_NODE_2_AUTH_TLS_KEY: ${{ secrets.LINUXONE_KEY }}

远程构建器身份验证

以下示例演示如何使用 SSH 或 TLS 处理远程构建器的身份验证。

SSH 身份验证

要能够使用 docker-container 驱动程序连接到 SSH 端点,您必须在 GitHub Runner 上设置 SSH 私钥和配置

name: ci

on:
  push:

jobs:
  buildx:
    runs-on: ubuntu-latest
    steps:
      - name: Set up SSH
        uses: MrSquaare/ssh-setup-action@2d028b70b5e397cf8314c6eaea229a6c3e34977a # v3.1.0
        with:
          host: graviton2
          private-key: ${{ secrets.SSH_PRIVATE_KEY }}
          private-key-name: aws_graviton2
      
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
        with:
          endpoint: ssh://me@graviton2

TLS 身份验证

您还可以使用远程驱动程序设置远程 BuildKit 实例。为了便于在工作流中集成,您可以使用环境变量,该变量使用 BuildKit 客户端证书设置 tcp:// 的身份验证

  • BUILDER_NODE_<idx>_AUTH_TLS_CACERT
  • BUILDER_NODE_<idx>_AUTH_TLS_CERT
  • BUILDER_NODE_<idx>_AUTH_TLS_KEY

<idx> 占位符是节点列表中节点的位置。

name: ci

on:
  push:

jobs:
  buildx:
    runs-on: ubuntu-latest
    steps:
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
        with:
          driver: remote
          endpoint: tcp://graviton2:1234
        env:
          BUILDER_NODE_0_AUTH_TLS_CACERT: ${{ secrets.GRAVITON2_CA }}
          BUILDER_NODE_0_AUTH_TLS_CERT: ${{ secrets.GRAVITON2_CERT }}
          BUILDER_NODE_0_AUTH_TLS_KEY: ${{ secrets.GRAVITON2_KEY }}

独立模式

如果 GitHub Runner 上未安装 Docker CLI,则直接调用 Buildx 二进制文件,而不是将其作为 Docker CLI 插件调用。如果您想在自托管运行器中使用 kubernetes 驱动程序,这会很有用

name: ci

on:
  push:

jobs:
  buildx:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
        with:
          driver: kubernetes
      
      - name: Build
        run: |
          buildx build .

隔离构建器

以下示例演示如何为不同的作业选择不同的构建器。

此功能可能很有用的一个示例场景是,当您使用 monorepo 时,并且您希望将不同的包精确地指定给特定的构建器。例如,某些包的构建可能特别耗费资源,需要更多的计算能力。或者它们需要配备特定功能或硬件的构建器。

有关远程构建器的更多信息,请参阅remote 驱动程序添加构建器节点示例

name: ci

on:
  push:

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - name: Set up builder1
        uses: docker/setup-buildx-action@v3
        id: builder1
      
      - name: Set up builder2
        uses: docker/setup-buildx-action@v3
        id: builder2
      
      - name: Build against builder1
        uses: docker/build-push-action@v6
        with:
          builder: ${{ steps.builder1.outputs.name }}
          target: mytarget1
      
      - name: Build against builder2
        uses: docker/build-push-action@v6
        with:
          builder: ${{ steps.builder2.outputs.name }}
          target: mytarget2
© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.