配置 GitHub Actions 构建器

此页面包含有关在使用我们的设置 Buildx 操作时配置 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,请使用输入image中的选项 driver-opts。例如,要固定到 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 容器日志,您必须 启用步骤调试日志记录,或--debugDocker 设置 Buildx操作中设置 buildkitd 标志:

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:
          buildkitd-flags: --debug
      - name: Build
        uses: docker/build-push-action@v5
        with:
          context: .

日志将在作业结束时可用:

BuildKit 容器日志

BuildKit 守护进程配置

如果您使用带有或输入的驱动程序(默认),您可以 向构建器 提供BuildKit 配置docker-containerconfigconfig-inline

注册表镜像

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

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:
          config-inline: |
            [registry."docker.io"]
              mirrors = ["mirror.gcr.io"]            

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

最大并行度

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

您可以config-inline像前面的示例一样使用输入,或者如果您需要输入,也可以使用存储库中的专用 BuildKit 配置文件 config

# .github/buildkitd.toml
[worker.oci]
  max-parallelism = 4
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:
          config: .github/buildkitd.toml

将附加节点附加到构建器

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

您可以使用该选项将节点附加到您正在创建的构建器append。它接受 YAML 字符串文档形式的输入,以消除与 GitHub Actions 本质上相关的限制:您只能在输入字段中使用字符串:

姓名类型描述
name细绳节点的名称。如果为空,则为所属构建器的名称,带有索引号后缀。如果您想要修改/删除工作流程的基础步骤中的节点,则设置它非常有用。
endpoint细绳要添加到构建器的节点的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@523473d91581ccbf89565e12b40faba93f2708bd # v1.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:
    branches:
      - "main"

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - uses: docker/setup-buildx-action@v3
        id: builder1
      - uses: docker/setup-buildx-action@v3
        id: builder2
      - name: Builder 1 name
        run: echo ${{ steps.builder1.outputs.name }}
      - name: Builder 2 name
        run: echo ${{ steps.builder2.outputs.name }}
      - name: Build against builder1
        uses: docker/build-push-action@v5
        with:
          builder: ${{ steps.builder1.outputs.name }}
          context: .
          target: mytarget1
      - name: Build against builder2
        uses: docker/build-push-action@v5
        with:
          builder: ${{ steps.builder2.outputs.name }}
          context: .
          target: mytarget2