端口
在模板上声明一个端口,Superheat 就会在实例启动时发布它,把容器端口映射到你租用的机器上的一个主机端口。你的工作负载监听的、并且希望从外部访问的任何东西——推理服务、Web 界面、指标端点——都需要在这里有一行。
声明一个端口
端口部分的每一行有四个部分。
| 组成部分 | 接受值 | 含义 |
|---|---|---|
| 容器端口 | 1 到 65535 | 你的进程在容器内部监听的端口。 |
| 协议 | tcp、udp、http、https | 该端口提供什么服务。http 和 https 通过 TCP 发布;这个区分记录了意图,并决定控制台如何呈现该端口。 |
| 标签 | 最多 64 个字符 | 一个便于人读的名字,显示在模板详情页。部分取值是保留的——见下文。 |
| 公开 | 开关,默认打开 | 记录在端口条目上。 |
你只声明容器端口。主机端口在启动时从机器已发布的端口范围中分配,你事先不会知道它。在容器内部,每个已发布的 TCP 端口都可以通过 SUPERHEAT_TCP_PORT_<container_port> 读取:
echo "$SUPERHEAT_TCP_PORT_7860"
这个环境变量就是你在工作负载内部读取主机端口的方式。实例页面的连接标签页会给出 SSH 命令,以及在模板有的情况下给出打开或打开 JupyterLab 链接。参见端口与网络。
标签
标签会被去掉首尾空白并在比较时忽略大小写,其中六个映射到四种保留角色。
| 标签 | 效果 |
|---|---|
open、open_button、open-button | 让该端口成为打开按钮的目标。端口以 open_button 角色发布,其端口号会作为 OPEN_BUTTON_PORT 传给容器。 |
ssh | 以 ssh 角色发布。 |
jupyter | 以 jupyter 角色发布。 |
app | 以 app 角色发布——这是默认值。 |
| 其他任意值 | 保留为显示标签;端口以 app 角色发布。 |
所以标签为 Jupyter、jupyter 或 JUPYTER 的端口含义完全相同,而 Gradio UI 只是一个带友好名字的普通 app 端口。
你不需要声明的端口
启动模式会前置它们需要的端口。在 ssh 模式下,容器端口 22 会自动加上。在 jupyter 模式下,22 和 8080 都会加上。你自己再声明一遍无害但多余:列表会按容器端口和协议去重,隐式条目胜过普通的 app 条目。
优先级从高到低是 ssh 和 jupyter,然后是 open_button,然后是 app。这正是让模板既能在列表里声明一个端口、又能把打开按钮指向它的机制——保留下来的条目带的是 open_button 角色。
在 args 模式下不会前置任何端口。如果你希望 args 模板能被 SSH 访问,就得自己负责在镜像里运行一个 SSH 服务并自己声明端口,否则应该改用 ssh 模式配一个派生自基础镜像的镜像。
打开按钮的端口
当模板指定了目标端口时,控制台会在实例上显示一个打开按钮。设置方法是给恰好一个端口打上 open 标签:
{
"ports": [
{ "container_port": 7860, "protocol": "http", "label": "open", "public": true },
{ "container_port": 9090, "protocol": "http", "label": "metrics", "public": true }
]
}
如果给多个端口都打上 open 标签,列表中的最后一个胜出,而这很少是你想要的。只声明一个。
在 jupyter 模式下你根本不需要打开按钮端口——控制台会根据 jupyter 角色渲染出打开 JupyterLab,URL 里已经带好了访问令牌。参见 JupyterLab。
端口是配方的一部分
端口列表是启动字段,所以编辑它会重新生成模板的 hash_id,并让固定分享链接失效。运行中的实例保留启动时的端口映射;新端口只会出现在编辑之后部署的实例上。