注: GitHub 托管的运行器目前在 GitHub Enterprise Server 上不受支持。 您可以在 GitHub 公共路线图 上查看有关未来支持计划的更多信息。
简介
本指南介绍如何创建执行 Docker 构建的工作流程,然后将 Docker 映像发布到 Docker Hub 或 GitHub Packages。 通过单个工作流程,您可以将映像发布到单一注册表或多个注册表。
注意:如果要推送到另一个第三方 Docker 注册表,则“发布映像到 GitHub Packages”部分可作为一个很好的模板。
基本要求
建议基本了解工作流程配置选项和如何创建工作流程文件。 更多信息请参阅“Learn GitHub Actions”。
您可能还发现基本了解以下内容是有帮助的:
- 加密的密码"
- "工作流程中的身份验证"
- “使用 Docker 注册表”
关于映像配置
本指南假定您对存储在 GitHub 仓库的 Docker 映像有完整的定义。 例如,仓库必须包含 Dockerfile 以及执行 Docker 构建所需的任何其他文件才可创建映像。
在本指南中,我们将使用 Docker build-push-action
操作来构建 Docker 映像并将其推送到一个或多个 Docker 注册表。 更多信息请参阅 build-push-action
。
Note: GitHub Actions on 您的 GitHub Enterprise Server 实例 may have limited access to actions on GitHub.com or GitHub Marketplace. For more information, see "Managing access to actions from GitHub.com" and contact your GitHub Enterprise site administrator.
将映像发布到 Docker Hub
每次在 GitHub Enterprise Server 上创建新版本时,都可以触发工作流程来发布映像。 以下示例中的工作流程在活动类型为 created
的 release
事件触发时运行。 有关 release
事件的更多信息,请参阅“触发工作流程的事件”。
在下面的示例工作流程中,我们使用 Docker login-action
和 build-push-action
操作构建 Docker 映像,如果构建成功,则将构建映像推送到 Docker Hub。
要推送到 Docker Hub,您需要有一个 Docker Hub 帐户,并创建一个 Docker Hub 仓库。 更多信息请参阅 Docker 文档中的“将 Docker 容器映像推送到 Docker Hub”。
Docker Hub 需要的 login-action
选项包括:
username
和password
:这是您的 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
,则映像在构建成功后将被推送到注册表。
# 此工作流使用未经 GitHub 认证的操作。
# 它们由第三方提供,并受
# 单独的服务条款、隐私政策和支持
# 文档管理。
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@v2
- 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 上创建新版本时,都可以触发工作流程来发布映像。 以下示例中的工作流程在活动类型为 created
的 release
事件触发时运行。 有关 release
事件的更多信息,请参阅“触发工作流程的事件”。
在下面的示例工作流程中,我们使用 Docker login-action
和 build-push-action
操作构建 Docker 映像,如果构建成功,则将构建的映像推送到 GitHub Packages。
GitHub Packages 需要的 login-action
选项包括:
registry
:必须设置为docker.pkg.github.com
。username
:您可以使用${{ github.actor }}
上下文自动使用触发工作流程运行的用户的用户名。 更多信息请参阅“上下文”。password
:您可以使用自动生成的GITHUB_TOKEN
密码作为密码。 更多信息请参阅“使用 GITHUB_TOKEN 验证身份”。
GitHub Packages 需要的 build-push-action
选项为:
-
push
:如果设置为true
,则映像在构建成功后将被推送到注册表。 -
tags
:必须以docker.pkg.github.com/OWNER/REPOSITORY/IMAGE_NAME:VERSION
。例如,对于存储在
http://github.com/octo-org/octo-repo
上 GitHub 中的映像octo-image
,tags
选项应设置为docker.pkg.github.com/octo-org/octo-repo/octo-image:latest
。 您可以如下所示设置单个标记,或在列表中指定多个标记。
# 此工作流使用未经 GitHub 认证的操作。
# 它们由第三方提供,并受
# 单独的服务条款、隐私政策和支持
# 文档管理。
name: Publish Docker image
on:
release:
types: [published]
jobs:
push_to_registry:
name: Push Docker image to GitHub Packages
runs-on: ubuntu-latest
permissions:
packages: write
contents: read
steps:
- name: Check out the repo
uses: actions/checkout@v2
- name: Log in to GitHub Docker Registry
uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
with:
registry: docker.pkg.github.com
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push Docker image
uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
with:
context: .
push: true
tags: |
docker.pkg.github.com/${{ github.repository }}/octo-image:${{ github.sha }}
docker.pkg.github.com/${{ github.repository }}/octo-image:${{ github.event.release.tag_name }}
上述工作流程检出 GitHub Enterprise Server 仓库,使用 login-action
登录到注册表,然后使用 build-push-action
操作:基于仓库的 Dockerfile
构建 Docker 映像;将该映像推送到 Docker 注册表,然后提交 SHA 和发行版本应用为映像标记。
发布映像到 Docker Hub 和 GitHub Packages
在单一工作流程中,您可以对每个注册表使用 login-action
和 build-push-action
> 操作,以将 Docker 映像发布到多个注册表。
下面的示例工作流程使用前面章节中的步骤(“发布映像到 Docker Hub”和“发布映像到 GitHub Packages”)来创建同时推送到两个注册表的单一工作流程。
# 此工作流使用未经 GitHub 认证的操作。
# 它们由第三方提供,并受
# 单独的服务条款、隐私政策和支持
# 文档管理。
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@v2
- 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 Docker registry
uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
with:
registry: docker.pkg.github.com
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
docker.pkg.github.com/${{ github.repository }}/my-image
- 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-pow-action
操作构建并推送 Docker 映像到 Docker Hub 和 Docker 注册表。