创建.github/workflows/build.yml
需要在github仓库配置2个secret:
| key | 值 |
|---|---|
| DOCKER_HUB_USERNAME | docker hub 用户名 |
| DOCKER_HUB_ACCESS_TOKEN | docker hub令牌 |
name: build-docker
on:
push:
branches: [main]
release:
types: [created] # 表示在创建新的 Release 时触发
jobs:
build_docker:
name: Build docker
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
- name: Get repository and branch name
shell: bash
#
run: |
echo "REPOSITORY=$(echo ${GITHUB_REPOSITORY#*/} | tr / -)" >> $GITHUB_ENV
- name: Build and push
id: docker_build
uses: docker/build-push-action@v4
with:
context: .
file: ./Dockerfile
push: true
platforms: linux/amd64,linux/arm64
# ${{ secrets.DOCKER_HUB_USERNAME }}/${{ env.REPOSITORY }}:${{ steps.date.outputs.today }}
# steps.date.outputs.today是日期,也可以用来作为镜像的后缀
# github.ref_name的值是当前分支名,一般是main
tags: |
${{ secrets.DOCKER_HUB_USERNAME }}/${{ env.REPOSITORY }}:${{ github.ref_name }}
${{ secrets.DOCKER_HUB_USERNAME }}/${{ env.REPOSITORY }}:latest上述配置中有一个获取仓库名的操作:
-
${GITHUB_REPOSITORY}: 这是 GitHub Actions 内置的环境变量,它包含了完整的仓库名称,格式为 owner/repo_name。例如,如果仓库是 my-org/my-repo,那么${GITHUB_REPOSITORY}的值就是 my-org/my-repo。 -
${GITHUB_REPOSITORY#*/}: 这是一个 Shell 操作,用于移除仓库名称前的 owner/ 部分。#*/ 表示移除最短匹配的模式(即 owner/),留下仓库名部分。例如,对于 my-org/my-repo,这个操作会返回 my-repo。 -
tr / -: 这是一个字符替换操作,将 / 替换为 -,但在这种情况下,仓库名称中通常不会有 /,所以这个命令对仓库名没有实际影响。 -
>> $GITHUB_ENV: 这是将生成的REPOSITORY变量写入到 GitHub Actions 的环境变量文件中,使其在后续步骤中可以通过${{ env.REPOSITORY }}来访问。
最终实现的效果是:假设有一docker用户DockerUser1,他通过github仓库GithubUserA/Repo1去推送镜像,那么生成的镜像名字是DockerUser1/Repo1。