【问题标题】:GITHUB_TOKEN permission denied write package when build and push docker in github workflows在 github 工作流中构建和推送 docker 时,GITHUB_TOKEN 权限被拒绝写入包
【发布时间】:2022-01-10 01:31:36
【问题描述】:

我有一个 Github 组织并尝试将容器注册表从 docker hub 迁移到 GitHub Packages。通过使用 Github Workflows,这是我用来将 docker 推送到 GitHub Packages 的 yaml:

name: ghcr_test
on:
  push:
    branches:
      - dev

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Login to GitHub Packages
        uses: docker/login-action@v1
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: Build and push Docker image
        uses: docker/build-push-action@v2
        with:
          context: .
          push: true
          tags: ghcr.io/${{ github.repository }}:${{ github.sha }}

GitHub 建议在操作工作流中使用 GITHUB_TOKEN,我已经在我的组织设置中仔细检查了它是否具有读写权限,但他们给了我这个错误

Error: buildx failed with: error: denied: permission_denied: write_package

有什么帮助吗?

【问题讨论】:

标签: github github-actions docker-registry


【解决方案1】:

检查这是否与actions/runner issue 1039有关

似乎 GITHUB_TOKEN 仅适用于默认分支...在 PR 分支上运行时需要使用自定义 PAT

还要检查这是否类似于this discussion:

事实证明,另一个组织成员推送了相同的包,默认情况下该包是私有的,并且归该组织成员所有。
由于没有其他人甚至可以看到该软件包存在,我们非常困惑。

我认为,新包由上传的用户私有,甚至对组织所有者都不可见,这种默认行为非常令人困惑。

如果没有,请尝试以described here 手动执行推送,以验证您的令牌(使用docker login -u USERNAME -p TOKEN ghcr.io,然后使用docker push)。然后 GitHub 操作可能会起作用。

【讨论】:

  • 具有读写包权限的自定义 PAT 有效,我想我会坚持使用 Custom PAT 而不是 GITHUB_TOKEN。谢谢。
【解决方案2】:

我认为您可能需要在这里做两件事:

  • 首先,确保包设置(包页面右下角)允许访问在相关存储库中运行的操作
  • 其次,确保您已将包权限添加到您的工作中

其中第二个涉及将此 sn-p 添加到您的工作流的作业中(请注意,如果您仅拉取一个容器,则可以读取此权限):

    permissions:
      packages: write

在您的工作流程中:

name: ghcr_test
on:
  push:
    branches:
      - dev

jobs:
  deploy:
    runs-on: ubuntu-latest
    permissions:
      packages: write
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Login to GitHub Packages
        uses: docker/login-action@v1
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: Build and push Docker image
        uses: docker/build-push-action@v2
        with:
          context: .
          push: true
          tags: ghcr.io/${{ github.repository }}:${{ github.sha }}

我遇到了类似的问题,最终偶然发现了该许可,突然一切都开始工作了。希望它也适合你。

【讨论】:

    【解决方案3】:

    正如https://github.community/t/unable-to-push-to-ghcr-io-from-github-actions/191761 中所指出的,默认的包访问设置将根据该容器的第一个图像的推送方式而有所不同:

    直接使用 PAT(至少从操作外部)推送不会分配存储库访问权限。所以需要单独去各个包的package settings,为仓库添加Actions访问权限。

    如果第一次推送来自工作流(使用 GITHUB_TOKEN),则默认情况下会为运行工作流的存储库配置源存储库链接和操作访问权限。

    删除手动推送的包并重新运行工作流。

    【讨论】:

      【解决方案4】:

      如果您要从 PAT 迁移到 GITHUB_TOKEN,您可能需要先删除包!

      我按照此处的说明进行操作,请参阅“升级访问 ghcr.io 的工作流程”: https://docs.github.com/en/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions

      这适用于前两个存储库,但在第三个存储库中,我必须先删除包才能使其正常工作。

      【讨论】:

        猜你喜欢
        • 2011-12-24
        • 2016-05-01
        • 2020-01-09
        • 2023-04-07
        • 2021-11-05
        • 2013-01-17
        • 1970-01-01
        • 2014-12-03
        • 2020-01-08
        相关资源
        最近更新 更多