【发布时间】:2017-01-13 04:12:37
【问题描述】:
以分离(后台)模式启动简单的 Docker 容器
docker run -d --name test ubuntu tail -f /dev/null
这是我连接到正在运行的容器的简单 golang 代码。 在当前连接中,我想获得功能性 tty。
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 命令。
- 登录后看不到提示,比如
root@ba351b44ca80:/#,只有在按回车后才会出现,但我的光标在没有提示的新行中; -
另外,获取上一个命令的箭头也不起作用 只打印出来
root@ba351b44ca80:/# ^[[A^[[A^[[A
但在幕后选择了上一个命令并通过按回车键执行。
-
对光标执行命令后不显示提示,如
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>
【问题讨论】:
-
你为什么不使用 Golang Docker 引擎 API? github.com/docker/engine-api/tree/master/client
-
@Alkaline 感谢您为我指明正确的方向这是我需要的解决方案go-dockerpty
-
好。您可以将其添加为答案,以便其他人找到它。干杯