Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

go-sh包 ,用到DOCKER操作指令时是无信息返回的。 #39

Open
svija opened this issue May 31, 2021 · 3 comments
Open

go-sh包 ,用到DOCKER操作指令时是无信息返回的。 #39

svija opened this issue May 31, 2021 · 3 comments

Comments

@svija
Copy link

svija commented May 31, 2021

go-sh包 ,用到DOCKER操作指令时是无信息返回的。
觉得非常奇怪。
go-sh包所在程序在宿主机上运行,运行docker --help是可以正常获得反馈,
但是使用docker ps -a之类的指令时,是无反馈回来的,
而在cmd面板ssh操作是可以正常反馈的。
是跨容器导致了这个问题吗,有办法解决吗?很头大

@svija
Copy link
Author

svija commented May 31, 2021

  • `func shell(s string) (string, error){
    //函数返回一个*Cmd,用于使用给出的参数执行name指定的程序
    cmd := exec.Command("/bin/bash", "-c", s)

    //读取io.Writer类型的cmd.Stdout,再通过bytes.Buffer(缓冲byte类型的缓冲器)将byte类型转化为string类型(out.String():这是bytes类型提供的接口)
    var out bytes.Buffer
    cmd.Stdout = &out

    //Run执行c包含的命令,并阻塞直到完成。 这里stdout被取出,cmd.Wait()无法正确获取stdin,stdout,stderr,则阻塞在那了
    err := cmd.Run()
    //checkErr(err)
    return out.String(), err
    }

`

@svija
Copy link
Author

svija commented May 31, 2021

我怀疑时cmd.Wait()这个函数无法正确获取到stdin,stdout了。
docker ps -a 或进入docker其他指令-it或加上/bin/bash的时候同样也是要调用到exec的。
估计是这个原因,问题是这个问题,真不知道怎么解决

@svija
Copy link
Author

svija commented May 31, 2021

在运行shell脚本时候,有三种方式来调用外部的脚本,exec(exec script.sh)、source(source script.sh)、fork(./script.sh)
1、exec(exec /home/script.sh):

    使用exec来调用脚本,被执行的脚本会继承当前shell的环境变量。但事实上exec产生了新的进程,他会把主shell的进程资源占用并替换脚本内容,继承了原主shell的PID号,即原主shell剩下的内容不会执行。

DOCKER PS -A 命令应该是以一个新的shell来进行的 ,因为新的shell集成了原主shell, 所以导致了这个问题;我认为是这样

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant