【问题标题】:Add a tag to a Docker image if there's a git tag using GitHub Action如果有使用 GitHub Action 的 git 标签,则将标签添加到 Docker 映像
【发布时间】:2023-03-28 04:35:01
【问题描述】:

我正在使用 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

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

【问题讨论】:

    标签: github-actions


    【解决方案1】:

    我找到了使用a dedicated action 的解决方案。我在一个单独的步骤中创建标签,然后添加它。 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 }}
    

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

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

    【讨论】:

      【解决方案2】:

      有一个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 }}
      

      【讨论】:

        【解决方案3】:

        可能是这样的:

        
        - name: Build and push
          id: gen_tags
          run: |
            if [[ $GITHUB_REF == 'refs/tags/'* ]]; then
              TAGS='["user/image:latest","user/image:'${GITHUB_REF/refs\/tags\//}'"]'
            else
              TAGS='["user/image:latest"]'
            fi
            echo '::set-output name=tags::'$TAGS
        
        - name: Build and push
          id: docker_build
          uses: docker/build-push-action@v2
          needs: gen_tags
          with:
            context: .
            push: true
            tags: ${{ fromJson(steps.gen_tags.outputs.tags) }}
        

        第一步生成标签列表和第二个构建/推送。如果$GITHUB_REFrefs/tags/ 开头,则它是一个标签,因此我们会生成一个带有两个 docker 标签的 json 列表。否则,我们使用仅包含 latest 标记的列表。由于我们只能传递字符串,因此我们必须将 json 输出为字符串,然后在第二步中使用fromJson 对其进行解析。对于丑陋的转义,我感到很抱歉(您实际上可能在那里遇到问题并且必须尝试几种不同的解决方案),但是如果不使脚本更复杂,这样做有点棘手。

        【讨论】:

        • 感谢您的建议。虽然它并不优雅,但我认为这个想法是有道理的。但是,我认为我遇到了您已经提到的转义问题。我创建了一个显示问题的最小示例。还没找到解决方案,如果你想看看,这里是项目:github.com/L7R7/docker-tags-github-actions/runs/…
        • 您可能必须打印输出以查看其外观。无论如何,您的自定义操作似乎是一个更可靠的解决方案。
        • 在第 5 行,第二部分(添加标签的部分)是否缺少“用户/图像:”前缀?
        猜你喜欢
        • 1970-01-01
        • 2020-01-31
        • 2023-02-09
        • 2018-12-28
        • 2021-09-03
        • 2021-09-02
        • 1970-01-01
        • 1970-01-01
        • 2022-11-11
        相关资源
        最近更新 更多