Cloud foundry 通过Garden API在Runc容器中执行进程

Cloud foundry 通过Garden API在Runc容器中执行进程,cloud-foundry,runc,garden-runc,Cloud Foundry,Runc,Garden Runc,我有一个安装,在我的本地开发机器上运行,并在其上托管了一个应用程序。我可以ssh到Diego cell虚拟机并执行 cell_z1/0# runc exec 5f9c8b67-9170-4c53-4bab-bbb2e6a3acdf /usr/bin/printenv 这将产生以下输出: INSTANCE_GUID=5f9c8b67-9170-4c53-4bab-bbb2e6a3acdf INSTANCE_INDEX=0 CF_INSTANCE_GUID=5f9c8b67-9170-4c53-4

我有一个安装,在我的本地开发机器上运行,并在其上托管了一个应用程序。我可以ssh到Diego cell虚拟机并执行

cell_z1/0# runc exec 5f9c8b67-9170-4c53-4bab-bbb2e6a3acdf /usr/bin/printenv
这将产生以下输出:

INSTANCE_GUID=5f9c8b67-9170-4c53-4bab-bbb2e6a3acdf
INSTANCE_INDEX=0
CF_INSTANCE_GUID=5f9c8b67-9170-4c53-4bab-bbb2e6a3acdf
CF_INSTANCE_INDEX=0
LANG=en_US.UTF-8
CF_INSTANCE_CERT=/etc/cf-instance-credentials/instance.crt
CF_INSTANCE_KEY=/etc/cf-instance-credentials/instance.key
HOME=/root
我认为通过调用

cell_z1/0# curl -X POST -d '{"path":"/usr/bin/printenv"}' localhost:7777/containers/5f9c8b67-9170-4c53-4bab-bbb2e6a3acdf/processes
然而,这将再次出现

{"Type":"","Message":"EOF","Handle":""}
不幸的是,这并没有告诉我什么。我尝试在JSON负载中添加
“user”:“vcap”
,但结果相同。当我添加
-H”内容类型:application/json“-d
时,我得到

curl: (56) Problem (2) in the Chunked-Encoded data

问题:如何通过Garden API在容器内执行任意命令并检索其输出

去图书馆

在Garden容器中执行命令的受支持方式是通过。例如:

gdnClient := client.New(connection.New("tcp", "127.0.0.1:7777"))

container, err := gdnClient.Create(garden.ContainerSpec{})
if err != nil {
  os.Exit(1)
}

buffer := &bytes.Buffer{}
process, err := container.Run(garden.ProcessSpec{
  Path: "/usr/bin/printenv",
}, garden.ProcessIO{
  Stdout: buffer,
  Stderr: buffer,
})
if err != nil {
  os.Exit(1)
}

exitCode, err := process.Wait()
if err != nil {
  os.Exit(1)
}

fmt.Printf("Exit code: %d, Process output %s", exitCode, buffer.String())
gaol create -n myContainer
gaol run -c "/usr/bin/printenv" myContainer
监狱CLI

如果您不想编写任何Go代码,可以使用不受支持的(但非常有用)代码。例如:

gdnClient := client.New(connection.New("tcp", "127.0.0.1:7777"))

container, err := gdnClient.Create(garden.ContainerSpec{})
if err != nil {
  os.Exit(1)
}

buffer := &bytes.Buffer{}
process, err := container.Run(garden.ProcessSpec{
  Path: "/usr/bin/printenv",
}, garden.ProcessIO{
  Stdout: buffer,
  Stderr: buffer,
})
if err != nil {
  os.Exit(1)
}

exitCode, err := process.Wait()
if err != nil {
  os.Exit(1)
}

fmt.Printf("Exit code: %d, Process output %s", exitCode, buffer.String())
gaol create -n myContainer
gaol run -c "/usr/bin/printenv" myContainer
如果您是从您的开发机器上运行,请确保适当地设置您的
GAOL_目标
,例如在bosh lite上设置10.244.16.6:7777

HTTP客户端

最后,通过任何HTTP客户机使用整个Garden API在技术上是可行的,但受支持的客户机/服务器库会执行一些连接劫持操作,这可能会混淆问题。特别是,运行进程是最复杂的API交互

首先,对运行端点进行连接,然后进行连接。garden客户端通过使用stdin被劫持的连接并点击另外两个来启动进程的stdio


让一个进程在容器中运行应该不会太难,只需要在请求体中编码一个json,但流式处理输出要复杂得多。

谢谢。我真的很想通过curl或一些JavaHTTP客户端库来实现这一点。我可以访问各种GET端点,比如api/containers/:id:/info等等。如果由于某种原因,无法使用常规HTTP客户端库通过API运行进程,我将退回到直接调用runc。如果遇到问题,我将更新我的答案,并提供更多相关信息,我建议在CloudFoundry slack中加入#garden频道,并从
/var/vcap/sys/log/garden/garden.std{out,err}.log