Skip to content

管理容器的环境变量、网络与自启动 ​

新建容器时可以设好环境变量、网络(含端口暴露)和自启动脚本;容器跑起来之后,在网页工作台的 更多标签页 → 设置容器 里随时修改,不需要重启或重建容器。风险与边界见安全须知。

旧容器

升级前创建的容器没有这些能力,「设置容器」页会提示“创建于旧版本,重建后可用”;它们的行为不变,也不会被迁移。

入口是顶栏「…」(更多标签页)菜单里的 设置容器。页面从上到下依次是:环境变量、网络(含端口暴露)、自启动(自启动要等网络规则下发完成才运行,所以排在网络后面);三块各有独立的保存按钮。新建容器的弹窗里同样按这个顺序设置。

什么时候生效 ​

改动生效时机
环境变量下一条命令 / 下一个新打开的终端;已在运行的进程和已经打开的终端不受影响
网络规则保存后约 2 秒内,容器不重启
端口暴露点「保存网络规则」后立即;serve 重启后自动恢复
自启动脚本容器下次启动;也可点「立即运行」

环境变量 ​

  • 这一块分两部分:环境变量文件(宿主机上的绝对路径,可添加多个)和直接填写的变量。文件每次执行命令时重新读取,所以改了文件下一条命令就生效;多个文件按顺序读取、后面的覆盖前面的,直接填写的变量优先于文件。页面会显示每个文件读到几个变量、哪些行被跳过。自启动脚本看到的是容器每次启动(下发规则)时文件内容的快照。
  • 直接填写的变量:表格视图默认遮罩名字含 KEY / TOKEN / SECRET / PASSWORD / AUTH / CREDENTIAL 的值,点眼睛才显示;文本视图是 KEY=VALUE 每行一项。
  • 语法只有一种(文本视图、环境变量文件、容器里的 /run/manyoyo/env 都一样):与 docker / podman 的 env-file 一致——不展开变量、不执行命令,值里的空格不需要引号(KEY=abc 123);同时兼容 shell / dotenv 的写法:可以带 export 前缀,值两端成对的引号会被去掉(KEY="abc 123" 与 KEY=abc 123 等价);# 只在行首是注释。表格里填的值写成文本时只在首尾有空白等必须时才加引号。
  • 变量保存在本机 ~/.manyoyo/containers/<id>/box/env,不会写进容器配置(podman inspect / docker inspect 看不到明文)。
  • 容器里也可以直接编辑 /run/manyoyo/env(同样的 KEY=VALUE 格式),下一条命令起生效。页面上会提示“容器内已修改”,非法的行(例如 1BAD=x)会标红并被跳过。
  • 新开的终端自动带上新变量;已打开的终端里执行 reload-env 即可生效(正在运行的进程不受影响)。
  • 保存时如果容器里刚改过这个文件,页面会提示冲突并让你重新加载,不会悄悄覆盖。

网络 ​

网络分「出站」(容器访问外部)和「入站」(外部访问容器)两张规则表,格式相同:动作(允许 / 拒绝)、目标 / 来源、端口(空 = 全部)、协议、操作(上移 / 下移 / 暂停 / 删除)。规则从上往下,第一条命中的生效;表里灰色锁定的行是系统默认,只能在它们上方加你自己的规则。

目标 / 来源除了 IP、网段、域名(*.example.com 匹配子域,仅出站),还可以输入 @ 选变量:

写法含义
@containers其他容器
@container:<名称>指定容器
@host宿主机
@private内网
@public公网(仅出站)
@metadata云服务器元数据(仅出站)
@any任何地址

目标框可以直接手打 @host、@container:名称,不用从列表里选。

容器本机和 manyoyo 必需的端点(DNS、上游代理、Playwright、软件源)始终允许,不用写;它们在表里是标「必需」的灰色行。标「模式默认」的是当前模式的默认行;标「派生」的是别的容器入站允许了本容器后自动出现的出站放行行,不用手加。

出站三个模式只决定表底部的默认行:

  • 收紧(默认):拒绝其他容器、宿主机、内网和云元数据,允许公网。
  • 仅白名单:其余全部拒绝(宿主机、其他容器的端口也要单独允许),只有你添加的允许规则能通。
  • 自定义:没有默认行,没匹配的就允许;切到自定义需要二次确认。

入站默认拒绝其他容器,允许宿主机;自定义同样没有默认行。切换模式时你写的规则都会保留。

我想…怎么做
让容器访问宿主机上的服务(例如本机 Ollama)出站加一行:允许 @host、端口 11434、tcp。宿主机服务要监听 0.0.0.0。验证:curl --noproxy '*' http://host.containers.internal:11434/
只允许访问 github.com 等少数网站出站切到「仅白名单」,加几行允许域名(如 github.com、*.githubusercontent.com);需要宿主机服务时再加 @host 那一行
只让容器访问 github.com 和宿主机的 11434 端口出站切到「仅白名单」,加两行:允许 github.com;允许 @host、端口 11434、tcp
屏蔽某个网站出站加一行:拒绝 *.doubleclick.net
访问局域网里的某台机器出站加一行:允许 192.168.1.50、端口 8000
让 web 访问 db 的 7000 端口去被访问的 db 的入站加一行:允许 @container:web、端口 7000;web 不用改,它的出站表里会自动多一行标「派生」的放行行
临时关掉一条规则点「暂停」
把容器 8080 端口暴露到宿主机见下方「端口暴露」

协议默认 all(不限);写 tcp / udp 只管那一种,留 all 也可以。入站的「容器端口」指被访问容器自己监听的端口。

入站的“允许 @any”不会放行其他受限容器的出站:别的容器要访问,需在它的出站里允许 @container:<名称>,或者入站来源写 @containers / @container:<名称>(对方出站自动放行)。

新建容器时如果在环境变量里填了指向宿主机或私有地址的 URL(如 OLLAMA_BASE_URL=http://host.containers.internal:11434),对应的允许规则会自动加上,规则表里看得到,也可以删。旧版本保存的网络配置会自动转成新格式。

域名规则 ​

只要有启用的域名规则,不论哪个模式,容器的 HTTP(S) 访问都会经过 manyoyo 网络里的专用过滤代理,按同一张表判断;网页终端、对话和 manyoyo 命令里的浏览器、curl、Agent 自动使用它。自己用 podman exec / docker exec 开的 shell 要先执行 source /run/manyoyo-sys/env.sh && reload-env;ssh、数据库等非 HTTP 协议请用 IP 规则。

  • 精确域名命中即放行(即使它解析到内网,写了就是信任它);通配域名(*.example.com)命中后,如果解析到宿主机、内网或云元数据地址,仍需有一条允许该地址的规则才放行。
  • 域名规则管不到直接连 IP 的程序,这类连接按 IP 规则判断:所以「收紧」「自定义」下的“拒绝域名”只拦走代理的 HTTP(S),要强制请用「仅白名单」。
  • 经上游代理出网时,域名由上游解析,防不住恶意域名的 DNS 重绑定,不要放行你不信任的域名。
  • Agent 的模型服务域名也要放行:新建容器时环境变量里 URL 的域名会自动加上;已有容器切到「仅白名单」后,页面会把它们列成按钮,点一下加入。
  • 网页打不开、点了没反应? 看「设置容器」页的最近被拦截,点「允许」直接放行并马上生效(插到你的规则最上面)。放行后页面引用的其他域名可能还会被拦,按同样方法逐个放行。浏览器自己的后台请求可以不管。Agent 运行时有新网站被拦,对话里会提示一次。
  • 被拦的访问会收到 403:浏览器里是 ERR_TUNNEL_CONNECTION_FAILED,curl 提示 CONNECT tunnel failed, response 403。
  • 过滤代理容器由 manyoyo 自动创建,名字形如 manyoyo-egress-xxxxxxxx,不要手动删除;它不依赖 serve。

端口暴露 ​

暴露端口由 serve 在宿主机监听,再把每个连接转进容器;默认只绑 127.0.0.1。端口暴露和其他规则一样在「保存网络规则」时生效,新建容器时也可以直接填。绑 0.0.0.0 等于局域网 / 公网可见(取决于宿主机的网络与防火墙),页面会要求二次确认。端口被占用会明确报错。

部署在公网服务器上 ​

下面这些端口监听 0.0.0.0,在公网服务器上等于对整个互联网开放(各自有凭据保护,但仍应在云安全组 / 防火墙里只放行需要的来源):

端口用途建议
serve 的监听端口网页服务配强密码;对外时放在 HTTPS 反向代理后面,见网页服务与远程访问
8935Playwright 浏览器服务(headed 模式,token 保护)同上,不对外开放
你绑定 0.0.0.0 的暴露端口容器里的服务优先绑 127.0.0.1,再用 ssh -L 或 HTTPS 反向代理访问;确需对外时在防火墙里限制来源 IP

自启动 ​

在「自启动」里写一段 bash 脚本:容器每次启动(新建、重启、podman machine 重启后再启动)都会由容器内的 init 运行一次,输出追加到 /run/manyoyo/autostart.log(页面「查看日志」)。打开“serve 启动时自动拉起此容器”后,manyoyo serve 启动也会把这个容器启动起来。

脚本以 root 身份运行,工作目录是容器的默认目录,路径请按容器内的路径写(宿主机挂载目录对应的容器路径在「容器详情」页的 containerPath)。「立即运行」的输出不会自动显示,点「查看日志」查看;脚本失败也会写进这个日志,排错先看这里。

容器的 PID 1 是 manyoyo 自带的 init:会回收僵尸进程、响应停止信号(stop 不再等满 10 秒)。网络规则下发完成之前,自启动脚本和 Agent 都不会运行。

配置字段 ​

新建容器时也可以写在 manyoyo.json 的全局或 runs.<name> 里,详见配置文件:autostart(脚本文本)、autostartOnServe、network。命令行 manyoyo run 新建容器时同样会写入,并在启动 / 连接容器前下发网络规则;管理入口是网页。

常见问题 ​

  • 容器重启后规则会丢吗? 不会丢:每次启动后 manyoyo 会重新下发,并且下发完成前自启动和 Agent 不会运行。serve 在运行时会监听容器启动事件,外部重启(podman restart)也会自动补下发。
  • 提示“网络规则下发失败”? 页面会显示原因,规则保持原样、容器保持“未放行”。常见原因是镜像里没有 nft(旧镜像,请升级镜像)或运行时不可用。
  • Docker 能用吗? 能。macOS 上的 Docker Desktop 需要共享 ~/.manyoyo 目录(默认已共享用户目录)。

Released under the MIT License.