Skip to main content
We publish frequent updates to our documentation, and translation of this page may still be in progress. For the most current information, please visit the English documentation.

发布 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

注意:your GitHub Enterprise Server instance 上的 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
# <a name="this-workflow-uses-actions-that-are-not-certified-by-github"></a>此工作流使用未经 GitHub 认证的操作。
# <a name="they-are-provided-by-a-third-party-and-are-governed-by"></a>它们由第三方提供,并受
# <a name="separate-terms-of-service-privacy-policy-and-support"></a>单独的服务条款、隐私政策和支持
# <a name="documentation"></a>文档。

# <a name="github-recommends-pinning-actions-to-a-commit-sha"></a>GitHub 建议将操作固定到提交 SHA。
# <a name="to-get-a-newer-version-you-will-need-to-update-the-sha"></a>若要获取较新版本,需要更新 SHA。
# <a name="you-can-also-reference-a-tag-or-branch-but-the-action-may-change-without-warning"></a>还可以引用标记或分支,但该操作可能会更改而不发出警告。

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。


## <a name="publishing-images-to-docker-hub-and--data-variablesproductprodname_registry-"></a>发布映像到 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}
# <a name="this-workflow-uses-actions-that-are-not-certified-by-github"></a>此工作流使用未经 GitHub 认证的操作。
# <a name="they-are-provided-by-a-third-party-and-are-governed-by"></a>它们由第三方提供,并受
# <a name="separate-terms-of-service-privacy-policy-and-support"></a>单独的服务条款、隐私政策和支持
# <a name="documentation"></a>文档。

# <a name="github-recommends-pinning-actions-to-a-commit-sha"></a>GitHub 建议将操作固定到提交 SHA。
# <a name="to-get-a-newer-version-you-will-need-to-update-the-sha"></a>若要获取较新版本,需要更新 SHA。
# <a name="you-can-also-reference-a-tag-or-branch-but-the-action-may-change-without-warning"></a>还可以引用标记或分支,但该操作可能会更改而不发出警告。

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。