容器里的 Agent,
触手可及。

容器里的 Agent 和你的 Mac 隔着一道墙,没法告诉 Gnista 它需要你。给容器装上 Gnista 的辅助程序,再留一条回来的路,它的会话就会和其他会话一样在刘海里各占一行。下面分别讲 Mac 上的 devcontainer、服务器上的容器和 Kubernetes pod 怎么设置。

免费试用 7 天无需账号和银行卡 · 之后一次性 €19

更新于

简短回答

  • 在你的 Mac 上:打开设置 ▸ 远程 ▸ 容器中的智能体,把它显示的几行加进你的 devcontainer.json,重建容器。
  • 在 Gnista 连接的服务器上:用同样的方法把服务器上的 ~/.gnista 挂载进容器。
  • 在 Kubernetes 里:在设置 ▸ 远程里选“其他主机…”,填上 kube:、context、namespace 和 pod。

Mac 上的 devcontainer

  1. 在 Gnista 的设置 ▸ 远程里,打开“容器中的智能体”。Gnista 会为容器建一个文件夹 ~/.gnista/containers,里面有两种处理器的 Linux 辅助程序。
  2. 点它显示的那几行下面的“复制”,加进你项目的 devcontainer.json。
  3. 重建容器。容器创建时,会接入里面装好的 Agent。
  4. 在容器里开一个会话。它的那一行显示的机器是 Docker。

要加的几行

"mounts": ["source=${localEnv:HOME}/.gnista/containers,target=/opt/gnista,type=bind"],
"containerEnv": { "GNISTA_HOME": "/opt/gnista" },
"postCreateCommand": "/opt/gnista/bin/gnista install all"

不用 devcontainer 的话,把同一个文件夹挂载进任意容器,然后在里面运行一次 /opt/gnista/bin/gnista install all:

docker run -it -v ~/.gnista/containers:/opt/gnista -e GNISTA_HOME=/opt/gnista your-image

工作原理

Docker Desktop 不会把 Mac 上的 socket 传进容器,所以 Gnista 在你 Mac 的回环地址上监听一个端口,容器通过 host.docker.internal 访问它。每次连接都必须先给出一个密码,密码就放在你挂载的文件夹里,所以 Mac 上的其他应用发不了消息。arm64 和 x86_64 镜像都可以。

服务器上的容器

先连接服务器:见通过 SSH 使用 Agent。然后把它的 ~/.gnista 挂载进容器,几行和上面一样,只是来源换成 ${localEnv:HOME}/.gnista。容器里的用户必须是 root,或者和你在服务器上的用户 ID 相同,才能访问那边的 socket。

Kubernetes pod

  1. 在 Mac 上装好 kubectl(用 Homebrew 或 Rancher Desktop),确认 kubectl exec 能连到那个 pod。
  2. 在 Gnista 的设置 ▸ 远程里,点“连接”,选“其他主机…”,填上 kube: 加 context、namespace 和 pod,比如 kube:prod/agents/agent-0。也可以填 deployment:kube:prod/agents/deploy/agents。
  3. Gnista 通过 kubectl exec 设置这个 pod,和设置服务器一样,并在上面保持一个中继,传送 Agent 的事件。pod 重启后,Gnista 会重新设置它。

限制

  • 能在容器或 pod 里运行命令的人,都能回应你的批准请求,和服务器一样。只连接你信任的。
  • 你 Mac 上容器里的会话都显示为 Docker,不区分是哪个容器。点一下,会调出正在 docker exec 或 kubectl exec 进去的那个终端标签页。
  • 只支持 Linux 容器和 pod,x86_64 或 arm64。
  • kubectl 的云端登录过期后,pod 的那一行会显示需要你;像平时用 kubectl 那样重新登录,Gnista 会自己再试。
  • 组织为自己的 Mac 关掉远程机器时,这个也一并关掉:见托管设置。

更多指南。