镜像仓库

配置镜像仓库账号密码、让全平台用户免密拉取/推送镜像,或排查拉取/推送权限问题时读这篇

平台使用 / 镜像构建与仓库
镜像仓库registryhubsecretimagePullSecret镜像拉取镜像推送image pullimage pushdocker loginHUBSECRETREPOSITORY_ORGPUSH_REPOSITORY_ORGk8s secret私有仓库

镜像仓库简介

镜像仓库这个功能的存在,是为了在推送和拉取镜像的时候,不用每次输入账号密码。在“在线开发 -> 镜像管理 -> 镜像仓库”界面中配置好镜像仓库的域名、用户名、密码之后,平台会自动在 k8s 集群中以 Secret 形式保存镜像仓库的账号密码。

输入图片说明

后端入口:Repository_ModelView_Apiroute_base = /repository_modelview/api(见 myapp/views/view_images.py:164)。 保存的表单字段为 name / server / user / password / hubsecret,其中 hubsecret 默认名为 <用户名>-hubsecretmyapp/views/view_images.py:68:117)。

命名空间的信息

添加(或修改保存)镜像仓库后,平台会把镜像仓库账号密码以 k8s Secret(docker-registry 类型,即 hubsecret)的形式写入到一批命名空间中。

输入图片说明

具体写入哪些命名空间由 security_manager.get_all_namespace() 决定(见 myapp/views/view_images.py:141myapp/security.py:1092):它会遍历所有项目组(Project),收集每个项目组配置的 notebook / pipeline / service / automl 四类命名空间。在默认配置下,这四类命名空间分别为 jupyterpipelineserviceautoml(见 myapp/config.py:768-780),因此默认会在这四个命名空间各创建一份 Secret。

说明:myapp/config.py:990 虽然定义了 HUBSECRET_NAMESPACE(默认含 pipeline/automl/jupyter/service/aihub/rental 六个命名空间),但全代码检索中该变量仅在定义行出现、并未被任何凭据下发逻辑引用(属未启用的配置项)。实际下发由 apply_hubsecret 调用 get_all_namespacemyapp/views/view_images.py:133-155myapp/security.py:1092)决定,后者只收集各项目组的 notebook / pipeline / service / automl 四类命名空间。因此默认情况下 aihubrental 命名空间不会收到 hubsecret(除非某项目组把这四类命名空间显式配置为 aihub/rental)。

增加集群、仓库

新增 k8s 集群

凭据下发逻辑会在保存仓库时遍历当时 CLUSTERS 中配置的所有集群 kubeconfig 并逐个写入 Secret(见 myapp/views/view_images.py:135-150)。因此如果之后新增了 k8s 集群,已有的镜像仓库 Secret 不会自动同步到新集群,需要重新修改、保存一次镜像仓库的配置,信息才会在新集群上生效。

全局秘钥

镜像拉取

镜像拉取时使用的 imagePullSecrets 由两部分合并而成(见 myapp/views/view_images.py:334-336):

  1. 配置文件中的 HUBSECRET 变量(默认 ['hubsecret'],见 myapp/config.py:975);
  2. 当前用户在“在线开发 -> 镜像管理 -> 镜像仓库”中个人创建的全部仓库秘钥(hubsecret)。

配置文件位置:本地为仓库内 install/docker/config.py(实际加载哪个由环境变量 MYAPP_CONFIG 决定,默认 myapp/config.py);线上为 infra 命名空间下名为 kubeflow-dashboard-config 的 ConfigMap(kustomize 生成时可能带 hash 后缀,见 install/kubernetes/cube/overlays/kustomization.yml)。

所以如果想让所有人都能拉取某个私有镜像,可选:

  • 方法一:把镜像设置为 public 公开镜像。
  • 方法二:在“在线开发 -> 镜像管理 -> 镜像仓库”中创建一个有拉取(推送)权限的仓库秘钥,并把对应的 k8s Secret 名称加入配置文件的 HUBSECRET 变量中,使其对全平台生效。

镜像推送

为了避免每个同学都单独配置推送秘钥,平台在保存/推送镜像时(镜像调试构建、notebook 保存镜像等)会自动挑选推送秘钥。以在线构建推送为例,挑选规则见 myapp/views/view_images.py:312-322

  • 先筛出 server 出现在目标镜像名中的仓库;
  • 在这些仓库里取“打分最高”的一个:打分公式为 len(server) + 1000 * (是否为本人创建)。即优先使用本人创建的仓库秘钥,其次选择 server 与镜像名匹配字符前缀最长的那个仓库秘钥;选中后用该仓库的账号密码执行 docker login 再推送。

所以为了让所有人都能推送到同一个镜像仓库,可以在“在线开发 -> 镜像管理 -> 镜像仓库”中创建一个具有推送权限的仓库秘钥。

镜像构建/推送时的默认目标组织由配置文件中的 PUSH_REPOSITORY_ORG 控制(默认 ccr.ccs.tencentyun.com/cube-studio/,见 myapp/config.py:980myapp/views/view_docker.py:153);而拉取/通用默认镜像所在组织为 REPOSITORY_ORG(默认同样为 ccr.ccs.tencentyun.com/cube-studio/,见 myapp/config.py:978)。如需改为自己的内网仓库,请按需修改这两个变量。

原文档此处只提到修改 REPOSITORY_ORG 作为推送默认仓库;按当前代码,推送默认组织实际由 PUSH_REPOSITORY_ORG 决定,已据代码更正。

相关文档

最后更新 2026-06-30完整文档以官方仓库为准:GitHub Wiki