GitHub Action推送Docker镜像到GitHub Packages报write_package权限错误问询
问题排查及解决方案
核心原因汇总
- GitHub Action 默认的
GITHUB_TOKEN未显式开启包写入权限:2023年之后GitHub新建仓库的Workflow默认权限为只读模式,未单独配置的情况下没有packages写入权限 - 仓库/组织的Packages权限配置未开放Workflow写入权限
- 镜像命名路径不匹配:推送的镜像路径需要和实际所属的组织/仓库名完全对应,大小写也要一致
- 旧版GitHub Packages域名(docker.pkg.github.com)的权限校验规则更严格,也可能触发权限拦截
可行解决方案
第一步:显式配置Workflow权限
在你的工作流yaml文件根层级(和on、jobs平级)添加权限配置:
permissions: contents: read packages: write
这个配置会给GITHUB_TOKEN开放包写入权限,是最常见的问题修复方案。
第二步:检查仓库Packages权限配置
- 进入你的仓库设置页面,找到「Packages」板块
- 确认「Actions access」配置为「Allow GitHub Actions to create and publish packages」
- 如果是组织级别的包,需要额外在组织设置的Packages权限中确认工作流有写入权限
第三步:校验镜像命名规则
确认你打标签的docker.pkg.github.com/organization/repository/image:latest路径中的organization是你的组织名/用户名,repository是当前仓库名,完全和实际值匹配,大小写保持一致。
可选优化:切换到新版GitHub Container Registry
目前GitHub更推荐使用ghcr.io作为容器镜像仓库域名,替换原有docker.pkg.github.com,权限校验逻辑更清晰:
- 登录步骤替换为:
echo ${{ secrets.GITHUB_TOKEN }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin
- 镜像标签替换为:
docker tag image:latest ghcr.io/organization/repository/image:latest
- 推送命令对应替换为ghcr.io的镜像地址即可。
修改后的完整工作流参考:
name: Docker Image CI permissions: contents: read packages: write on: workflow_dispatch: push: branches: [ main ] pull_request: branches: [ main ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up JDK 16 uses: actions/setup-java@v3 with: java-version: 16 distribution: 'temurin' - name: Build with Maven run: mvn -f ACS/pom.xml clean install dependency:copy-dependencies - name: Login to GitHub Container Registry run: echo ${{ secrets.GITHUB_TOKEN }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin - name: Build the Docker image run: docker build -t image:latest . - name: Tag the Docker image run: docker tag image:latest ghcr.io/organization/repository/image:latest - name: Push the Docker image to the registry run: docker push ghcr.io/organization/repository/image:latest
内容的提问来源于stack exchange,提问作者Angel Hadzhiev
相关产品推荐
相关产品推荐

