Skip to main content
我们经常发布文档更新,此页面的翻译可能仍在进行中。 有关最新信息,请访问英语文档

发布 Docker 映像

您可以将 Docker 映像发布到注册表,例如 Docker Hub 或 GitHub Packages,作为持续集成 (CI) 工作流程的一部分。

注意:GitHub Enterprise Server 目前不支持 GitHub 托管的运行器。 可以在 GitHub public roadmap 上查看有关未来支持计划的更多信息。

简介

本指南介绍如何创建执行 Docker 构建的工作流程,然后将 Docker 映像发布到 Docker Hub 或 GitHub Packages。 通过单个工作流程,您可以将映像发布到单一注册表或多个注册表。

注意:如果你想推送到另一个第三方 Docker 注册表,“将映像发布到 GitHub Packages”部分中的示例可以用作一个很好的模板。

先决条件

建议基本了解工作流程配置选项和如何创建工作流程文件。 有关详细信息,请参阅“了解 GitHub Actions。”

您可能还发现基本了解以下内容是有帮助的:

关于映像配置

本指南假定您对存储在 GitHub 仓库的 Docker 映像有完整的定义。 例如,存储库必须包含一个 Dockerfile,以及执行 Docker 构建以创建映像所需的任何其他文件。

可以使用预定义的注释键向容器映像添加元数据,包括说明、许可证和源存储库。 有关详细信息,请参阅“使用 Container registry”。

在本指南中,我们将使用 Docker build-push-action 操作来构建 Docker 映像并将其推送到一个或多个 Docker 注册表。 有关详细信息,请参阅 build-push-action

注意:你的 GitHub Enterprise Server 实例 上的 GitHub Actions 对 GitHub.com 或 GitHub Marketplace 上的操作具有有限的访问权限。 有关详细信息,请参阅“管理对 GitHub.com 上操作的访问”并联系 GitHub Enterprise 站点管理员。

将映像发布到 Docker Hub

每次在 GitHub Enterprise Server 上创建新版本时,都可以触发工作流来发布映像。 以下示例中的工作流在活动类型为 createdrelease 事件触发时运行。 有关 release 事件的详细信息,请参阅“触发工作流的事件”。

在下面的示例工作流中,我们使用 Docker login-actionbuild-push-action 操作来构建 Docker 映像,如果构建成功,则将构建的映像推送到 Docker Hub。

要推送到 Docker Hub,您需要有一个 Docker Hub 帐户,并创建一个 Docker Hub 仓库。 有关详细信息,请参阅 Docker 文档中的“将 Docker 容器映像推送到 Docker Hub”。

Docker Hub 所需的 login-action 选项是:

  • usernamepassword:这是 Docker Hub 用户名和密码。 我们建议将 Docker Hub 用户名和密码存储为机密,使它们不会公开在工作流程文件中。 有关详细信息,请参阅“创建和使用已加密的机密。”

Docker Hub 所需的 metadata-action 选项是:

  • images:你正在构建/推送到 Docker Hub 的 Docker 映像的命名空间和名称。

Docker Hub 所需的 build-push-action 选项是:

  • tags:你的新映像的标签,格式为 DOCKER-HUB-NAMESPACE/DOCKER-HUB-REPOSITORY:VERSION。 您可以如下所示设置单个标记,或在列表中指定多个标记。
  • push:如果设置为 true,则映像将推送到注册表(如果成功构建)。
YAML
# 此工作流使用未经 GitHub 认证的操作。
# 它们由第三方提供,并受
# 单独的服务条款、隐私政策和支持
# 文档。

# GitHub 建议将操作固定到提交 SHA。
# 若要获取较新版本,需要更新 SHA。
# 还可以引用标记或分支,但该操作可能会更改而不发出警告。

name: Publish Docker image

on:
  release:
    types: [published]

jobs:
  push_to_registry:
    name: Push Docker image to Docker Hub
    runs-on: [self-hosted]
    steps:
      - name: Check out the repo
        uses: actions/checkout@v3
      
      - name: Log in to Docker Hub
        uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      
      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
        with:
          images: my-docker-hub-namespace/my-docker-hub-repository
      
      - name: Build and push Docker image
        uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

上述工作流签出 GitHub 存储库,使用 login-action 登录注册表,然后使用 build-push-action 操作:基于存储库的 Dockerfile 构建 Docker 映像;将映像推送到 Docker Hub,并向映像应用标签。

发布映像到 GitHub Packages

注意:GitHub Enterprise Server 的 Container registry 当前为 beta 版本,可能会有变化。

必须启用 GitHub Packages 和子域隔离才能使用 Container registry。 有关详细信息,请参阅“使用容器注册表”。

每次在 GitHub Enterprise Server 上创建新版本时,都可以触发工作流来发布映像。 以下示例中的工作流在活动类型为 createdrelease 事件触发时运行。 有关 release 事件的详细信息,请参阅“触发工作流的事件”。

在下面的示例工作流中,我们使用 Docker login-actionbuild-push-action 操作来构建 Docker 映像,如果构建成功,则将构建的映像推送到 GitHub Packages。

GitHub Packages 所需的 login-action 选项是:

  • registry:必须设置为 containers.HOSTNAME
  • username:你可以使用 ${{ github.actor }} 上下文自动使用触发工作流运行的用户的用户名。 有关详细信息,请参阅“上下文。”
  • password:可以使用自动生成 GITHUB_TOKEN 的密码机密。 有关详细信息,请参阅“使用 GITHUB_TOKEN 进行身份验证。”

GitHub Packages 所需的 build-push-action 选项是:

  • push:如果设置为 true,则映像将推送到注册表(如果成功构建)。

  • tags:必须采用格式 containers.HOSTNAME/OWNER/REPOSITORY/IMAGE_NAME:VERSION 设置。

    例如,对于存储在 https://HOSTNAME/octo-org/octo-repo 的 GitHub Enterprise Server 上的名为 octo-image 的映像,tags 选项应设置为 containers.HOSTNAME/octo-org/octo-repo/octo-image:latest。 您可以如下所示设置单个标记,或在列表中指定多个标记。

    YAML

此工作流使用未经 GitHub 认证的操作。

它们由第三方提供,并受

单独的服务条款、隐私政策和支持

文档。

GitHub 建议将操作固定到提交 SHA。

若要获取较新版本,需要更新 SHA。

还可以引用标记或分支,但该操作可能会更改而不发出警告。

name: Create and publish a Docker image

on: push: branches: ['release']

env: REGISTRY: containers.HOSTNAME IMAGE_NAME: ${{ github.repository }}

jobs: build-and-push-image: runs-on: [self-hosted] permissions: contents: read packages: write

steps:
  - name: Checkout repository
    uses: actions/checkout@v3

  - name: Log in to the Container registry
    uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
    with:
      registry: ${{ env.REGISTRY }}
      username: ${{ github.actor }}
      password: ${{ secrets.GITHUB_TOKEN }}

  - name: Extract metadata (tags, labels) for Docker
    id: meta
    uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
    with:
      images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}

  - name: Build and push Docker image
    uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
    with:
      context: .
      push: true
      tags: ${{ steps.meta.outputs.tags }}
      labels: ${{ steps.meta.outputs.labels }}

上述工作流程通过推送到“发行版”分支触发。 它签出 GitHub 存储库,并使用 `login-action` 登录到 Container registry。 然后,它将提取 Docker 映像的标签和标记。 最后,它使用 `build-push-action` 操作构建映像并将其发布到 Container registry。


## 发布映像到 Docker Hub 和 GitHub Packages

 

<div class="extended-markdown note border rounded-1 mb-4 p-3 color-border-accent-emphasis color-bg-accent f5">

注意:GitHub Enterprise Server 的 Container registry 当前为 beta 版本,可能会有变化。 

必须启用 GitHub Packages 和子域隔离才能使用 Container registry。 有关详细信息,请参阅“[使用容器注册表](/packages/working-with-a-github-packages-registry/working-with-the-container-registry)”。

</div>

 

在单个工作流中,你可以通过对每个注册表使用 `login-action` 和 `build-push-action` 操作将 Docker 映像发布到多个注册表。

以下示例工作流使用上述部分(“[将映像发布到 Docker Hub](#publishing-images-to-docker-hub)”和“[将映像发布到 GitHub Packages](#publishing-images-to-github-packages)”)中的步骤创建推送到两个注册表的单个工作流。

```yaml{:copy}
# 此工作流使用未经 GitHub 认证的操作。
# 它们由第三方提供,并受
# 单独的服务条款、隐私政策和支持
# 文档。

# GitHub 建议将操作固定到提交 SHA。
# 若要获取较新版本,需要更新 SHA。
# 还可以引用标记或分支,但该操作可能会更改而不发出警告。

name: Publish Docker image

on:
  release:
    types: [published]

jobs:
  push_to_registries:
    name: Push Docker image to multiple registries
    runs-on: [self-hosted]
    permissions:
      packages: write
      contents: read
    steps:
      - name: Check out the repo
        uses: actions/checkout@v3
      
      - name: Log in to Docker Hub
        uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      
      - name: Log in to the Container registry
        uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
        with:
          registry: containers.HOSTNAME
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      
      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
        with:
          images: |
            my-docker-hub-namespace/my-docker-hub-repository
            containers.HOSTNAME/${{ github.repository }}
      
      - name: Build and push Docker images
        uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

上述工作流签出 GitHub Enterprise Server 存储库,使用 login-action 两次以登录到两个注册表,并使用 metadata-action 操作生成标记和标签。 然后 build-push-action 操作构建 Docker 映像并将其推送到 Docker Hub 和 Container registry。