启动模式
启动模式决定容器启动时实际运行什么、哪些端口会被发布,以及你的启动脚本会不会被执行。它是模板上影响最大的一个字段。
四种模式
args | ssh | jupyter | vm | |
|---|---|---|---|---|
| 启动什么 | 镜像自身的入口点 | 基础镜像入口点:22 端口上的 sshd | sshd 加上通过 HTTPS 提供的 JupyterLab | 一台完整的 KVM 虚拟机 |
| 派生自基础镜像的镜像 | 不需要 | 必需 | 必需 | 不需要 |
| 隐式端口 | 无 | 前置 22,标签为 ssh | 前置 22(ssh)和 8080(jupyter) | 前置 22,标签为 ssh |
| 你声明的端口 | 按原样发布 | 追加在 22 之后,标签为 app | 追加在 22 和 8080 之后,标签为 app | 追加在 22 之后,标签为 app |
args_str | 拆分为容器命令 | 忽略 | 忽略 | 忽略 |
onstart | 不执行 | 首次启动时运行一次 | 首次启动时运行一次 | 随启动一起下发 |
| 报价要求 | 无 | 无 | 无 | 支持 VM 的报价 |
| 连接方式 | 你自己发布的端口 | SSH | 打开 JupyterLab 按钮,或 SSH | SSH |
args
默认模式。Superheat 完全按照镜像作者的意图运行你的镜像:使用镜像自带的入口点,并把 args_str 按 shell 分词规则拆分成命令。--model llama-3 --port 8000 会变成四个参数。
启动路径上不会注入任何东西,这就是 onstart 在这里不起作用的原因——没有 Superheat 入口点来运行它。如果你在 args 模式下需要做准备工作,就把它构建进镜像,或者让它成为你的命令做的第一件事。
推理服务、训练任务,以及任何不是你自己构建的上游镜像,都用 args。
命令自己退出时,实例会进入 error,error_code 为 workload_completed:任务已经结束,GPU 已释放,计费也已停止。从日志里取走你需要的东西,然后销毁它。运行完的任务无法再次启动。
ssh
启动 Superheat 基础镜像入口点:它把你的公钥装进 /root/.ssh/authorized_keys,在容器 22 端口上启动 sshd,把你的启动脚本运行一次,然后移交给镜像的 CMD(或者进入空闲状态让容器保持运行)。
容器 22 端口会自动前置到端口列表里;你不需要声明它。主机侧端口从机器已发布的端口范围中分配,绝不会是 22——实例页面会为你生成完整的连接字符串。
当你想要的是一台可以在上面干活的机器,而不是一个可调用的服务时,用 ssh。
jupyter
ssh 做的一切,外加 JupyterLab。容器端口 22 和 8080 都会被前置。Jupyter 使用自签名证书通过 HTTPS 绑定在 0.0.0.0:8080,根目录是你的 Jupyter 工作目录(默认 /workspace)。关掉 JupyterLab 开关则改为提供经典 notebook。
访问令牌由平台生成并下发到容器。控制台会拼出已经带上令牌的打开 JupyterLab 链接,并在实例的连接标签页的访问令牌下显示令牌本身;API 把它作为实例的 access_token 返回。参见实例访问令牌。
Jupyter 通过 HTTPS 配自签名证书提供服务,以便令牌和你的 notebook 流量在直连路径上是加密的。出现警告属于预期行为。
vm
一台完整的 KVM 虚拟机,而不是容器。VM 模板只能启动到主机支持 VM 的报价上。在部署页面,把 VM 模板配到不支持 VM 的报价上时该报价不可选,原因写着“此机器不支持 VM。”,并且部署按钮保持禁用;API 执行同样的规则,返回 422 OFFER_NOT_VM_CAPABLE。启动时会编译进 SSH 访问,所以连接方式和 ssh 模式一样。
不需要派生自基础镜像的镜像,因为虚拟机并不运行容器入口点。
为什么 ssh 和 jupyter 只能用 ACR 上的精选镜像
ssh 和 jupyter 模式下,Superheat 用基础镜像的入口点接管容器,启动 sshd(jupyter 模式下还有 JupyterLab)。它根据镜像引用决定是否接管,而不是根据镜像里的标签:在 Superheat CN 上,只有 ACR 上 superheat/ 命名空间里的镜像(superheat-cn-registry.cn-shanghai.cr.aliyuncs.com/superheat/<仓库>)会被接管。
其他任何镜像——包括你 FROM 基础镜像构建、推送到自己仓库的镜像——都按它自己的入口点运行,不会自动开放 SSH 端口。你自己的镜像请用 args 模式,并在模板上声明它提供服务的端口。参见 Superheat CN 上的镜像。
端口优先级
前置隐式端口之后,列表会按容器端口和协议去重,优先级更高的条目胜出:
ssh / jupyter > open_button > app
这个顺序让你既能在端口列表里声明某个端口,又能把打开按钮指向它:该条目返回时标签是 open_button 而不是 app。它同时也意味着,在 ssh 或 jupyter 模式下你自己声明 22 或 8080 不会改变任何东西——隐式条目保留它的角色。
标签和打开按钮见端口。
之后更改模式
启动模式是启动配方的一部分,所以编辑它会重新生成模板的 hash_id,任何固定分享链接都会失效。运行中的实例不受影响——它们保留启动时使用的配方。