使用 GitHub Actions 自动构建、标记和发布 Docker 镜像

img

使用GitHub构建 Docker 镜像,使用语义化版本标记并通过 Github actions 发布至 Docker Hub

创建完这个工作流程后,只需将你的标签推送到 GithubDocker 镜像就会被构建并推送到 Docker Hub 仓库,并携带你的Github标签版本。

你无须手动构建、打标签和推送Docker镜像,Github action会替你做这些任务。

开始

要想实现 github 自动构建 docker 镜像,我使用这些 Github Action.

  1. Docker元数据操作
  2. 构建并推送 Docker 镜像

我的文件夹和文件结构是这样的。Dockerfile在项目根目录中。

MyApp
  |__ app/
  |__ Dockerfile

现在让我们创建工作流文件。

  1. 在项目根目录下创建一个名为 .github 的文件夹

  2. 在 .github 文件夹内创建一个名为 workflows 的文件夹。

  3. 在 workflows 文件夹内,创建一个名为 docker_workflow.yaml 的文件(此文件可以根据需要命名。文件扩展名应为 .yaml).

  4. 前往你的 Github 仓库设置,并创建这些存储库内容((Settings > Secrets And Variables > Actions > New repository secret。DOCKERHUB_USERNAME—你的 Docker Hub 用户名。

    DOCKERHUB_TOKEN—你的 Dockerhub 令牌 DH_REPO_NAME—DockerHub 存储库名称)。

  5. 将这段代码复制粘贴到 .yaml 文件中

#NAME
name: Build And Push Images to Dockerhub
#EVENT
on:
  push:
    tags:
      - 'v*'
#JOBS
jobs:
  build_docker_images:
    name: Build Docker Image To Dockerhub
    runs-on: [ubuntu-latest]
    steps:
      - name: Code Checkout
        uses: actions/checkout@v3

      - name: Extract Metadata
        uses: docker/metadata-action@v5
        id: meta
        with:
          images: |
            ${{secrets.DOCKERHUB_USERNAME}}/${{secrets.DH_REPO_NAME}}            
          tags: |
            type=semver,pattern={{version}}            

      - name: Docker Login
        uses: docker/login-action@v2
        with:
          username: ${{secrets.DOCKERHUB_USERNAME}}
          password: ${{secrets.DOCKERHUB_TOKEN}}
          logout: true

      - name: Build And Push
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
  1. 将这段代码推送到主分支。

如何工作

当你想要构建并推送Docker镜像至Docker Hub时,只需创建一个带有你需要的版本号的标签。这应该遵循语义版本控制。例如,创建一个名为v1.0.0的标签然后推送它。

git tag v1.0.0
git push origin --tags

现在将使用标签**1.0.0, latest**构建 Docker 镜像,并将其推送到 Docker Hub

工作流程分解

on:
  push:
    tags:
      - 'v*'

该部分指示何时运行工作流程。根据指示,当我们推送一个名称以v开头的标签时,此工作流将运行。如果你想使用分支而不是标签,请用branches替换tags

- name: Extract Metadata
  uses: docker/metadata-action@v5
  id: meta
  with:
    images: |
      ${{secrets.DOCKERHUB_USERNAME}}/${{secrets.DH_REPO_NAME}}      
    tags: |
      type=semver,pattern={{version}}      

这里我使用推送事件来触发此工作流程。Docker Metadata Action 可以从推送事件中提取元数据。它将从推送事件中获取标签版本。在 images 下,我们列出要使用的 Docker 镜像名称列表。同时给了一个 ID 用于下一部分的操作。在 Tags 部分,我们指定 Docker 镜像标记应如何进行。

这里我使用语义化版本号命名规范。你可以使用分支名称、提交哈希等进行标记操作等等,在他们的文档页面找到更多详细信息。

- name: Build And Push
  uses: docker/build-push-action@v5
  with:
    context: .
    push: true
    tags: ${{ steps.meta.outputs.tags }}

在这一部分,将使用标签推送 Docker 镜像到 Docker Hub 仓库中。上下文是指 Dockerfile 的位置。

Docker 镜像的标签在 tags 部分中提及。我们从先前的元数据部分获取该标签。

这就是为什么我给出了一个 id,*meta*。在这里,我使用那个 id 来获取标签。

目前就是这些了。希望本文能对你有所帮助。

类似的帖子