【问题标题】:When would I use `--interactive` without `--tty` in a Docker container?我什么时候在 Docker 容器中使用不带 `--tty` 的 `--interactive`?
【发布时间】:2016-02-17 14:36:39
【问题描述】:

我做了一些谷歌搜索,但没有找到我运行 docker run -i some_image 而不是 docker run -it some_image 的案例。

如果我运行docker run -i --name sample some_image bash,容器会在前台运行,但我无法从我所在的 shell 与它交互。我什至无法使用 CTRL+C 停止它。但是,我可以打开另一个 shell 并运行 docker exec -it sample bash 并获得对容器的访问权限。

如果我运行docker run -i -d --name sample some_image bash,容器会立即退出。我可以用docker start sample 重新启动它,然后它会一直运行,所以我可以运行docker exec -it sample bash 并再次与之交互。

但是,在所有这些情况下,我最终都使用-it 与我的容器进行交互。在哪个世界里我不需要-t 标志?

干杯

【问题讨论】:

  • 我不知道-i -d的预期结果是什么
  • @Auzias -i -d 在下面我与github.com/docker/docker/blob/… 链接的示例中:您启动并分离一个进程,您可以附加到该进程并使用标准输入向所述进程提供数据。跨度>

标签: docker


【解决方案1】:

由于-i 即使未连接 STDIN 也会保持打开状态,因此它允许组合(管道)。
例如:

docker run ubuntu printf "line1\nline2\n" | docker run -i ubuntu grep line2 | docker run -i ubuntu sed 's/line2/line3/g'

(来源:issue 14221

或者:

$ echo hello | docker run -i busybox cat
  hello

(来源:issue 12401

现在想象一下,这不是在键盘前,而是在脚本中使用,您可以通过比 shell | 更好的方式实际写入进程标准输入:例如 integration-cli/docker_cli_attach_test.go

【讨论】:

  • 能否请您一步一步解释第一个 sn-p 中到底发生了什么?它最终会创建 3 个不同的容器吗? printf "line1\nline2\n" 是否在第一个容器内运行?第一个容器是否将"line1\nline2\n" 写入主机控制台?打印“hello”后容器会退出吗?
  • @gisek 3 个容器连续运行,每个容器在它们的echo/sed 操作之后立即终止。-i 允许标准输入获取前一个容器生成的标准输出.
  • 谢谢。全部完成后,我们最终会得到 3 个新创建的停止容器吗?
  • @gisek 是的。 docker container prune 会照顾他们(docker 1.13+/docker 17.03 ce: stackoverflow.com/a/32723127/6309
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
  • 2022-09-28
  • 2013-11-27
相关资源
最近更新 更多