如果存在 git 标签,请使用 GitHub Action 将标签添加到 Docker 映像

l7r*_*7r7 15 github-actions

我正在使用 GitHub Actions 使用build-push-action构建 docker 映像。我想在将图像推送到 docker 注册表之前向其添加标签:

  • 每个图像都应该标记为latest
  • 如果触发构建的提交附加了 git 标签,则图像也应该使用此标签进行标记。

我有一些类似的事情:

- name: Build and push
  id: docker_build
  uses: docker/build-push-action@v2
  with:
    context: .
    push: true
    tags:
      - user/image:latest
Run Code Online (Sandbox Code Playgroud)

总是添加更多标签很容易,但我只想在有 git 标签的情况下添加它。有没有办法做到这一点?

Kev*_*don 19

有一个docker/metadata-action可以做到这一点。确保设置推送标签触发器以及您可能需要的任何其他触发器。操作文档有更多关于它适用于每种事件触发器类型的标签的详细信息。另请参阅https://docs.github.com/en/actions/publishing-packages/publishing-docker-images了解有关 Docker 映像发布的一般主题的更多信息。

name: Tag Docker Image with Git

on:
  push:
    tags: [ v* ]

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - name: Log into the Container registry
      uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
      with:
        registry: ${{ env.REGISTRY }}
        username: ${{ github.actor }}
        password: ${{ secrets.GITHUB_TOKEN }}

    - name: Extract metadata for the Docker image
      id: meta
      uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
      with:
        images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}

    - name: Build and push the Docker image
      uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
      with:
        context: .
        push: true
        tags: ${{ steps.meta.outputs.tags }}
        labels: ${{ steps.meta.outputs.labels }}
Run Code Online (Sandbox Code Playgroud)

  • 如果您没有获得“latest”标签,因为您使用的是“master”以外的分支,例如“main”,请阅读 https://github.com/docker/metadata-action#latest-tag (5认同)

l7r*_*7r7 8

我找到了使用专用操作的解决方案。我在单独的步骤中创建标签,然后添加它。CI 配置的相关部分如下所示:

- name: Docker meta
  id: docker_meta
  uses: crazy-max/ghaction-docker-meta@v1
  with:
    images: l7r7/sample
    tag-custom: latest
    tag-semver: |
      {{raw}}
- name: Build and push
  id: docker_build
  uses: docker/build-push-action@v2
  with:
    context: .
    push: false
    tags: ${{ steps.docker_meta.outputs.tags }}
    labels: ${{ steps.docker_meta.outputs.labels }}
Run Code Online (Sandbox Code Playgroud)

准确地说,这并不完全是我所要求的,因为它也会添加一个包含分支名称的标签。但这对我来说没关系。我可以忍受这一点。

可以在此处找到完整的工作示例。