使用golang连接到具有功能tty

时间:2016-09-05 19:22:30

标签: go docker tty pty

以分离(后台)模式启动简单的Docker容器

docker run -d --name test ubuntu tail -f /dev/null

这是我的简单golang代码,我连接到正在运行的容器。 在目前的连接中,我希望得到功能性的。

package main

import (
  "fmt"
  "os/exec"
  "bufio"
  "io"
  "os"
  "github.com/kr/pty"
)

func main() {
  cmd := exec.Command("docker", "exec", "-it", "test", "bin/bash")

  tty, err := pty.Start(cmd)
  if err != nil {
    fmt.Println("Error start cmd", err)
  }
  defer tty.Close()

  go func() {
    scanner := bufio.NewScanner(tty)
    for scanner.Scan() {
       fmt.Println(scanner.Text())
    }
  }()
  go func() {
    io.Copy(tty, os.Stdin)
  }()

  err = cmd.Wait()
  if err != nil {
    fmt.Println("Error Waiting", err)
  }
}

更多它的工作原理,但有一些想法不起作用,因为我会从我的终端运行docker命令。

  1. 登录后我看不到提示,如root@ba351b44ca80:/#仅在点击返回后出现,但我的光标在新行,没有提示;
  2. 同样向上箭头以获取上一个命令不起作用 只打印出来

    root@ba351b44ca80:/#
    ^[[A^[[A^[[A
    
  3. 但是在场景前面的命令后面被选中,并且通过点击返回它被执行。

    1. 执行游标命令后不显示提示,如

      root@ba351b44ca80:/# ls
      bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
      boot  etc  lib   media  opt  root  sbin  sys  usr
      <Here my cursor>
      

1 个答案:

答案 0 :(得分:0)

go-dockerclient值得一试。它是Docker远程API的一个简单漂亮的抽象。许多开源项目都使用它,并且定期维护。