跳到主要内容

私有镜像仓库

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

公开镜像——Docker Hub、GHCR 上的公开软件包、Superheat 基础镜像——在这里什么都不用填。

添加凭据

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

只要镜像仓库提供,就用作用域受限的访问令牌,而不是账户密码——带 read:packages 的 GitHub 个人访问令牌、AWS ECR 令牌,或者仓库自己的部署令牌。

镜像仓库主机是从镜像引用中推导出来的,不需要单独填写。第一个路径段如果包含点号或冒号就会被当作主机,所以 ghcr.io/acme/trainer 会对 ghcr.io 认证,而 acme/trainer 会对 Docker Hub 认证。

密码如何存储

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

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

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

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

更新与清除

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

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

分享与复制

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

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

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

当拉取失败时

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

  1. 凭据在你真正部署的那个模板上,而不是在某个副本上。
  2. 令牌没有过期,并且拥有对该仓库的读取权限。
  3. 镜像引用里写明了镜像仓库主机,凭据才会被发到正确的地方。
  4. 标签存在。[Automatic] 标签解析出来的是 cuda-<minor> 标签,而私有镜像几乎肯定没有发布这种标签——请固定一个真实标签。

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