跳到主要内容

私有镜像仓库

如果你的镜像存放在私有镜像仓库里,运行它的机器需要凭据才能拉取。在私有镜像仓库部分把凭据附加到模板上:一个用户名,以及一个密码或访问令牌。

公开镜像——ACR 上的 superheat/* 和 mirror/* 仓库,包括 Superheat 基础镜像——在这里什么都不用填。它们允许匿名拉取,参见Superheat CN 上的镜像。

添加凭据​

字段接受值说明
用户名最多 256 个字符API 以 registry_user 返回。
密码 / 令牌最多 1,000 个字符只写。任何端点都不会返回。

只要镜像仓库提供,就用作用域受限的访问令牌,而不是账户密码——例如你的阿里云 ACR 实例的访问令牌,或者仓库自己的只读部署令牌。

镜像仓库主机是从镜像引用中推导出来的,不需要单独填写。第一个路径段如果包含点号或冒号就会被当作主机,所以 acme-registry.cn-shanghai.cr.aliyuncs.com/acme/trainer 会对 acme-registry.cn-shanghai.cr.aliyuncs.com 认证,而 acme/trainer 会对 Docker Hub 认证。Docker Hub 从中国大陆的主机无法访问,所以在 Superheat CN 上请始终在镜像引用里写明镜像仓库主机,并使用中国大陆的镜像仓库。

密码如何存储​

密码在写入数据库之前会先加密,使用的应用密钥作为部署机密保管。它只在唯一一个时刻被解密:部署把你的模板编译成一次启动的时候,好让主机登录并拉取镜像。

它从不在 API 响应中返回,从不在控制台中显示,也从不包含在分享出去的配方里。API 暴露的是一个布尔值:

{
"registry_user": "acme-ci",
"has_registry_password": true
}

编辑表单也是同样的做法——当已经存储了密码时,密码字段会显示一个写着 ••••••(未更改) 的占位符。

更新与清除​

编辑时,密码字段留空意味着保持不变。要轮换密码,输入新密码。要彻底移除凭据,在 API 中发送 registry_password: null 并清空用户名。

修改用户名会重新生成模板的 hash_id,因为用户名是启动配方的一部分。只改密码则不会——存储的机密被有意地排除在哈希范围之外,所以轮换令牌不会破坏固定分享链接。

分享与复制​

用户名会随公开模板一起传出去

registry_user 是配方的一部分,任何能读取该模板的人都能读到它。受保护的只有密码。不要使用本身就敏感的用户名,也不要以为把模板设为公开后镜像仓库账户还能保持私密。

复制一个不属于你的组织的模板时,用户名和密码都会从副本中丢掉。复制者从来没有读取密码的权限,而获得副本的所有权不应该顺带给出这个权限。启动之前请在副本上填入你自己的凭据。复制你已经拥有的模板则会保留它们。

当拉取失败时​

镜像拉取不下来的实例不会进入 running。按顺序检查:

  1. 凭据在你真正部署的那个模板上,而不是在某个副本上。
  2. 令牌没有过期,并且拥有对该仓库的读取权限。
  3. 镜像引用里写明了镜像仓库主机,凭据才会被发到正确的地方。
  4. 这个镜像仓库从中国大陆的主机拉得到。Docker Hub 无法访问,GHCR 非常慢。参见Superheat CN 上的镜像。
  5. 标签存在。对 superheat/ 以外的镜像,[Automatic] 会按 latest 拉取;你的镜像没有发布 latest 时,请固定一个真实标签。

实例日志里带有拉取错误。参见日志。