对 docker 的 -i“即使未连接也保持 STDIN 打开”感到困惑

2024-01-27

The -i标志被描述为“即使未连接也保持 STDIN 打开”,但是Docker 运行参考 https://docs.docker.com/engine/reference/run/#foreground还说:

如果您不指定 -a,则 Docker 将附加所有标准流。

那么,默认情况下,标准输入已附加,但未打开?我认为当 STDIN 已连接但未打开时没有任何意义,对吗?


确切的代码 https://github.com/docker/docker/blob/75a7f4d90cde0295bcfb7213004abce8d4779b75/commands.go#L1797-L1806与该文档相关的是:

// 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")
        }
    }
}

With:

flStdin := cmd.Bool("i", false, "Keep stdin open even if not attached")

换句话说,stdin 已附加only if -i is set.

        if *flStdin {
            flAttach.Set("stdin")
        }

从这个意义上说,“所有”标准流并不准确。

如下所述,该代码(由文档引用)此后改为 https://github.com/docker/docker/blob/07f580489908bf6a3373daac1473045406e1130d/runconfig/opts/parse.go#L102:

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

-a不再有人“附加所有流”,但是“指定您想要附加的流” https://github.com/docker/docker/blob/07f580489908bf6a3373daac1473045406e1130d/runconfig/opts/parse.go#L138-L142.

var (
    attachStdin  = flAttach.Get("stdin")
    attachStdout = flAttach.Get("stdout")
    attachStderr = flAttach.Get("stderr")
)

-i仍然是一个有效的选项 https://github.com/docker/docker/blob/07f580489908bf6a3373daac1473045406e1130d/runconfig/opts/parse.go#L150-L152:

if *flStdin {
    attachStdin = true
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对 docker 的 -i“即使未连接也保持 STDIN 打开”感到困惑 的相关文章

随机推荐