You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批量修改ghcr.io私有Docker镜像可见性遇API报错,求解决方案

解决方案:批量修改GHCR镜像可见性+自动公开设置

一、修复单个包可见性修改的REST API请求

你的PATCH请求返回404,核心问题是请求头不正确,修改包可见性需使用标准GitHub API头部,而非删除预览头。正确请求格式如下:

curl -X PATCH \
  -H "Authorization: token <REDACTED>" \
  -H "Accept: application/vnd.github.v3+json" \
  -d '{"visibility":"public"}' \
  https://api.github.com/users/mkst/packages/container/compilers%2Fmacosx%2Fgcc-5026

若仍报错,确认你的token已勾选write:packages权限(在GitHub设置→开发者设置→个人访问令牌中配置)。

二、批量修改所有私有容器包

1. 列出所有私有容器包API路径

先获取你名下所有私有容器包的修改地址:

curl -H "Authorization: token <REDACTED>" \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/users/mkst/packages?package_type=container

返回结果中每个包的url字段即为修改可见性的目标地址。

2. 批量修改脚本(bash示例)

用循环遍历所有私有包并批量设置为公开:

#!/bin/bash
TOKEN="<REDACTED>"
USERNAME="mkst"

# 获取所有私有容器包的URL
PACKAGES=$(curl -s -H "Authorization: token $TOKEN" \
  -H "Accept: application/vnd.github.v3+json" \
  "https://api.github.com/users/$USERNAME/packages?package_type=container" | \
  jq -r '.[] | select(.visibility == "private") | .url')

# 逐个修改可见性
for URL in $PACKAGES; do
  echo "Setting $URL to public..."
  curl -X PATCH -s -H "Authorization: token $TOKEN" \
    -H "Accept: application/vnd.github.v3+json" \
    -d '{"visibility":"public"}' \
    "$URL"
done

注:需提前安装jq工具用于JSON解析。

三、后续新增镜像自动设为公开

方案1:GitHub Actions推送后自动调用API

在镜像构建推送的Workflow中添加步骤,自动设置包可见性:

- name: Set package visibility to public
  run: |
    curl -X PATCH \
      -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
      -H "Accept: application/vnd.github.v3+json" \
      -d '{"visibility":"public"}' \
      "https://api.github.com/users/${{ github.actor }}/packages/container/${{ env.PACKAGE_NAME }}"
  env:
    PACKAGE_NAME: "compilers/macosx/gcc-5026" # 可根据构建逻辑动态替换包名

注:GITHUB_TOKEN默认具备write:packages权限,需确保Workflow所在仓库权限设置允许。

方案2:GraphQL Mutation(更稳定)

若REST API仍有问题,可采用GraphQL实现修改:

查询私有容器包ID

先获取所有私有包的id用于后续修改:

curl -X POST \
  -H "Authorization: token <REDACTED>" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "query { user(login: \"mkst\") { packages(packageType: CONTAINER, first: 100) { nodes { id name visibility } } } }"
  }' \
  https://api.github.com/graphql

单个包修改示例

curl -X POST \
  -H "Authorization: token <REDACTED>" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "mutation { updatePackageVisibility(input: { packageId: \"MDc6UGFja2FnZTU1ODcyMjI=\", visibility: PUBLIC }) { package { visibility } } }"
  }' \
  https://api.github.com/graphql

可将上述逻辑封装为脚本,实现批量修改或在Workflow中自动执行。

四、迁移至组织后的适配

迁移到组织后,仅需调整API路径和GraphQL查询对象:

  • REST API路径将users/mkst替换为orgs/{组织名}
  • GraphQL将user(login: "mkst")替换为organization(login: "{组织名}")

确保令牌具备组织的write:packages权限即可。

内容的提问来源于stack exchange,提问作者mkst

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:06:00