简介
本指南介绍如何创建执行 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。
将映像发布到 Docker Hub
每次在 GitHub 上创建新版本时,都可以触发工作流程来发布映像。 以下示例中的工作流程在活动类型为 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 需要的 build-push-action 选项包括:
tags:新映像的标记,格式为DOCKER-HUB-NAMESPACE/DOCKER-HUB-REPOSITORY:VERSION。 您可以如下所示设置单个标记,或在列表中指定多个标记。push:如果设置为true,则映像在构建成功后将被推送到注册表。
name: Publish Docker image
on:
release:
types: [published]
jobs:
push_to_registry:
name: Push Docker image to Docker Hub
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v2
- name: Log in to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Push to Docker Hub
uses: docker/build-push-action@v2
with:
push: true
tags: my-docker-hub-namespace/my-docker-hub-repository:latest发布映像到 GitHub Packages
每次在 GitHub 上创建新版本时,都可以触发工作流程来发布映像。 以下示例中的工作流程在活动类型为 created 的 release 事件触发时运行。 有关 release 事件的更多信息,请参阅“触发工作流程的事件”。
在下面的示例工作流程中,我们使用 Docker login-action 和 build-push-action 操作构建 Docker 映像,如果构建成功,则将构建映像推送到 GitHub Packages。
GitHub Packages 需要的 login-action 选项包括:
registry:必须设置为docker.pkg.github.com。username:您可以使用${{ github.actor }}上下文自动使用触发工作流程运行的用户的用户名。 更多信息请参阅“GitHub Actions 的上下文和表达式语法”。password:您可以使用自动生成的GITHUB_TOKEN密码作为密码。 更多信息请参阅“使用 GITHUB_TOKEN 验证身份”。
GitHub Packages 需要的 build-push-action 选项包括:
tags:必须设置为格式docker.pkg.github.com/OWNER/REPOSITORY/IMAGE_NAME:VERSION。 例如,对于http://github.com/octo-org/octo-repo上名为octo-imagestored on GitHub 的映像,tags选项应设置为docker.pkg.github.com/octo-org/octo-repo/octo-image:latest。 您可以如下所示设置单个标记,或在列表中指定多个标记。push:如果设置为true,则映像在构建成功后将被推送到注册表。
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@v1
with:
registry: docker.pkg.github.com
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build container image
uses: docker/build-push-action@v2
with:
push: true
tags: |
docker.pkg.github.com/${{ github.repository }}/octo-image:${{ github.sha }}
docker.pkg.github.com/${{ github.repository }}/octo-image:${{ github.ref }}发布映像到 Docker Hub 和 GitHub Packages
在单一工作流程中,您可以对每个注册表使用 login-action 和 build-push-action> 操作,以将 Docker 映像发布到多个注册表。
下面的示例工作流程使用前面章节中的步骤(“发布映像到 Docker Hub”和“发布映像到 GitHub Packages”)来创建同时推送到两个注册表的单一工作流程。
name: Publish Docker image
on:
release:
types: [published]
jobs:
push_to_registries:
name: Push Docker image to multiple registries
runs-on: ubuntu-latest
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@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Log in to GitHub Docker Registry
uses: docker/login-action@v1
with:
registry: docker.pkg.github.com
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Push to Docker Hub
uses: docker/build-push-action@v2
with:
push: true
tags: my-docker-hub-namespace/my-docker-hub-repository:${{ github.ref }}
- name: Build container image
uses: docker/build-push-action@v2
with:
push: true
tags: docker.pkg.github.com/${{ github.repository }}/my-image:${{ github.ref }}上面的工作流程检出 GitHub 仓库,使用两次 login-action 操作登录两个注册表,然后使用两次 build-push-action 操作构建并推送 Docker 映像到 Docker Hub 和 GitHub Packages。 对于这两个步骤,它都使用工作流程事件的 Git 参考标记构建的 Docker 映像。 此工作流程在发布 GitHub 版本时触发,因此对两个注册表的引用将是该版本的 Git 标记。