终端访问
在运行中的应用容器内打开交互式 shell(通过浏览器或在服务器上),以及供管理员使用的主机终端。
应用终端
应用的 Terminal 选项卡会在其运行中的容器内打开 shell,通过 WebSocket 连接到带 TTY 的 docker exec。
- 打开应用,进入 Terminal 选项卡。
- 选择 shell:
sh (auto)、bash、ash (Alpine)或zsh。镜像中必须存在该 shell。 - 点击 Connect。Disconnect 结束会话;关闭选项卡也会结束会话。
- shell 以容器的用户身份运行,位于其工作目录,并带有应用的环境变量(包括密钥)。
- 与文件管理器一样,挂载卷之外的文件修改会在下一次部署时消失。
- 控制面板连接的是主容器。对于由多个服务组成的应用,WebSocket
/api/v1/apps/<id>/terminal接受service参数。
通过命令行
sh0 ssh <app> [命令] 在应用容器中执行命令,未指定时打开 /bin/sh(真实输出):
$ sh0 ssh my-api ls /app
[*] Connecting to my-api (a17f99c5c4ac)...
server.js
$ sh0 ssh my-api # opens /bin/sh in the container Warning
sh0 ssh 不经过 API:它通过标签找到容器,并在运行 CLI 的那台机器上执行 docker exec -it。因此它只能在 sh0 服务器本机上、由有权使用 Docker 的用户、在真正的终端中运行(否则会报 “cannot attach stdin to a TTY-enabled container because stdin is not a terminal”)。它无法访问部署在远程节点上的应用。在您自己的电脑上,请使用 Terminal 选项卡。主机终端
Settings 中的 Host Access 提供服务器本机上的终端(不在任何容器内)以及主机文件浏览器。shell 以 sh0 服务的权限运行,在标准安装中即 root。
Danger
主机终端意味着对整台机器的完全控制:其上的每个应用、每个数据库、每个密钥。它仅限 owner 和 admin 角色使用;请据此谨慎分配这些角色。
数据库
在 sh0 v1.10.2 中,数据库服务器没有自己的终端。要运行 psql、mysql 或 redis-cli,请打开主机终端(或通过 SSH 登录服务器),对数据库容器使用 docker exec:
docker ps --format '{{.Names}}' | grep <database-name>
docker exec -it <container> psql -U <user> <database>谁可以打开 shell
- 应用终端 -- 需要在应用所属项目上拥有 developer 角色。
- 主机终端 -- 需要 owner 或 admin 角色。
- API 密钥 -- 作用域不是
admin的密钥无法打开这两种 shell。 - 撤销 -- 会话期间若用户的访问权限被移除,会话会被关闭。
限制
- 应用必须在运行:已停止的应用没有容器。
- 无法进入没有 shell 的镜像(distroless、scratch)。
- Terminal 选项卡可通过节点连接访问远程节点上的应用;
sh0 ssh不行。 - sh0 不会记录在 shell 中输入的命令。