配置 GitHub Actions 构建器

本页包含有关在以下情况下配置 BuildKit 实例的说明 使用我们的 Setup Buildx Action

版本固定

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

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

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

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

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

BuildKit 容器日志

要在使用驱动程序时显示 BuildKit 容器日志, 您必须启用 Step Debug 日志记录、 或在 Docker Setup Buildx 操作中设置 buildkitd 标志:docker-container--debug

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 驱动程序(默认)和 or 输入,则可以向你的生成器提供 BuildKit 配置configbuildkitd-config-inline

注册表镜像

您可以直接在 工作流,输入为: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"]            

有关使用 Registry 镜像的更多信息,请参阅 Registry 镜像

最大并行度

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

您可以像前面的示例一样使用输入,也可以使用 来自仓库的专用 BuildKit 配置文件(如果需要),输入如下:buildkitd-config-inlineconfig

# .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 不处理的更复杂的情况。在原生节点上构建 通常具有更好的性能,并允许您将构建分布在 多台机器。

您可以使用该选项将节点附加到您正在创建的生成器。 它以 YAML 字符串文档的形式进行输入以消除限制 与 GitHub Actions 的内在关联:您只能在输入中使用字符串 领域:append

名字类型描述
name字符串节点的名称。如果为空,则它是它所属的生成器的名称,带有索引号后缀。如果要修改/删除工作流基础步骤中的节点,则设置它非常有用。
endpoint字符串要添加到构建器的节点的 Docker 上下文或端点
driver-opts列表其他特定于驱动程序的选项列表
buildkitd-flags字符串buildkitd 守护进程的标志
platforms字符串修复了节点的平台。如果不为空,则值优先于检测到的值。

以下是使用远程节点和远程驱动程序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 binary 被直接调用,而不是将其称为 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 时, 并且您希望将不同的软件包精确定位到特定的构建器。例如 有些软件包的构建可能特别耗费资源,并且需要更多 计算。或者他们需要配备特定功能的构建器或 硬件。

有关远程生成器的更多信息,请参阅远程驱动程序附加生成器节点示例

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