使用 GitHub Actions 自动构建、标记和发布 Docker 镜像
使用GitHub
构建 Docker
镜像,使用语义化版本标记并通过 Github actions
发布至 Docker Hub
。
创建完这个工作流程后,只需将你的标签推送到 Github
,Docker
镜像就会被构建并推送到 Docker Hub
仓库,并携带你的Github
标签版本。
你无须手动构建、打标签和推送Docker
镜像,Github action
会替你做这些任务。
开始
要想实现 github
自动构建 docker
镜像,我使用这些 Github Action
.
我的文件夹和文件结构是这样的。Dockerfile
在项目根目录中。
MyApp
|__ app/
|__ Dockerfile
现在让我们创建工作流文件。
-
在项目根目录下创建一个名为 .github 的文件夹
-
在 .github 文件夹内创建一个名为 workflows 的文件夹。
-
在 workflows 文件夹内,创建一个名为 docker_workflow.yaml 的文件(此文件可以根据需要命名。文件扩展名应为 .yaml).
-
前往你的
Github
仓库设置,并创建这些存储库内容((Settings > Secrets And Variables > Actions > New repository secret。DOCKERHUB_USERNAME
—你的Docker Hub
用户名。DOCKERHUB_TOKEN
—你的Dockerhub
令牌DH_REPO_NAME—DockerHub
存储库名称)。 -
将这段代码复制粘贴到 .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 }}
- 将这段代码推送到主分支。
如何工作
当你想要构建并推送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
来获取标签。
目前就是这些了。希望本文能对你有所帮助。