Docs/ 运维/ 终端访问

终端访问

在运行中的应用容器内打开交互式 shell(通过浏览器或在服务器上),以及供管理员使用的主机终端。

应用终端

应用的 Terminal 选项卡会在其运行中的容器内打开 shell,通过 WebSocket 连接到带 TTY 的 docker exec。

  1. 打开应用,进入 Terminal 选项卡。
  2. 选择 shell:sh (auto)、bash、ash (Alpine) 或 zsh。镜像中必须存在该 shell。
  3. 点击 Connect。Disconnect 结束会话;关闭选项卡也会结束会话。
  • shell 以容器的用户身份运行,位于其工作目录,并带有应用的环境变量(包括密钥)。
  • 与文件管理器一样,挂载卷之外的文件修改会在下一次部署时消失。
  • 控制面板连接的是主容器。对于由多个服务组成的应用,WebSocket /api/v1/apps/<id>/terminal 接受 service 参数。

通过命令行

sh0 ssh <app> [命令] 在应用容器中执行命令,未指定时打开 /bin/sh(真实输出):

Terminal (on the server)
$ 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:

Terminal (on the server)
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 中输入的命令。