私有镜像仓库
如果你的镜像存放在私有镜像仓库里,运行它的机器需要凭据才能拉取。在私有镜像仓库部分把凭据附加到模板上:一个用户名,以及一个密码或访问令牌。
公开镜像——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。按顺序检查:
- 凭据在你真正部署的那个模板上,而不是在某个副本上。
- 令牌没有过期,并且拥有对该仓库的读取权限。
- 镜像引用里写明了镜像仓库主机,凭据才会被发到正确的地方。
- 标签存在。
[Automatic]标签解析出来的是cuda-<minor>标签,而私有镜像几乎肯定没有发布这种标签——请固定一个真实标签。
实例日志里带有拉取错误。参见日志。