混淆码头工人的-i"即使没有附加也能保持STDIN开放"

Yon*_*Yon 10 docker

-i标志被描述为"即使没有附加也保持STDIN打开",但Docker运行参考也说:

如果未指定-a,则Docker将附加所有标准流.

所以,默认情况下,stdin是附加的,但是没有打开?我认为STDIN连接但没有打开时没有任何意义,对吧?

Von*_*onC 8

与该文档相关的确切代码是:

// If neither -d or -a are set, attach to everything by default
if len(flAttach) == 0 && !*flDetach {
    if !*flDetach {
        flAttach.Set("stdout")
        flAttach.Set("stderr")
        if *flStdin {
            flAttach.Set("stdin")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

附:

flStdin := cmd.Bool("i", false, "Keep stdin open even if not attached")
Run Code Online (Sandbox Code Playgroud)

换句话说,只有-i设置时才附加stdin .

        if *flStdin {
            flAttach.Set("stdin")
        }
Run Code Online (Sandbox Code Playgroud)

从这个意义上讲,"所有"标准流并不准确.

如下所述,该代码(由doc引用)后来改为:

cmd.Var(&flAttach, []string{"a", "-attach"}, "Attach to STDIN, STDOUT or STDERR")
Run Code Online (Sandbox Code Playgroud)

-a不再是"连接所有流",而是"指定你想要附加的流".

var (
    attachStdin  = flAttach.Get("stdin")
    attachStdout = flAttach.Get("stdout")
    attachStderr = flAttach.Get("stderr")
)
Run Code Online (Sandbox Code Playgroud)

-i仍是一个有效的选择:

if *flStdin {
    attachStdin = true
}
Run Code Online (Sandbox Code Playgroud)

  • 不,我不这么认为.`docker run -a stdin -a stdout -a stderr -t python:2`和`docker run -it python:2`不一样,我不能在前者输入任何东西. (2认同)
  • 从代码中,`-i`传递给容器的配置([link](https://github.com/docker/docker/blob/07f580489908bf6a3373daac1473045406e1130d/runco​​nfig/opts/parse.go#L380)),所以在我看来, `-i`是关于容器**中的**打开STDIN,`-a`是关于**将主机的STDIN连接到容器的STDIN**(STDOUT和STDERR相同).我只是不知道为什么docker允许将STDIN附加到容器的STDIN,即使它没有打开. (2认同)