我何时在Docker容器中使用`--interactive`而不使用`--tty`?

art*_*art 29 docker

我做了一些谷歌搜索,没有运气找到一个我跑,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旗帜?

干杯

Von*_*onC 31

由于-i即使没有附着也能保持STDIN打开,因此可以进行成分(配管).
例如:

docker run ubuntu printf "line1\nline2\n" | docker run -i ubuntu grep line2 | docker run -i ubuntu sed 's/line2/line3/g'
Run Code Online (Sandbox Code Playgroud)

(来源:issue 14221)

要么:

$ echo hello | docker run -i busybox cat
  hello
Run Code Online (Sandbox Code Playgroud)

(来源:issue 12401)

现在想象一下,这不是在键盘前面,而是在脚本中使用,你可以通过比shell更好的东西写入进程stdin |:integration-cli/docker_cli_attach_test.go

  • @gisek 3 个容器连续运行,每个 tome 在它们的 `echo`/`sed` 操作之后立即终止。`-i` 允许 stdin 获取由前一个容器生成的 stdout。 (2认同)
  • @gisek是的.一个`docker container prune`将负责它们(docker 1.13 +/docker 17.03 ce:http://stackoverflow.com/a/32723127/6309) (2认同)
  • @AndrzejGis 已经晚了几年,但你也可以这样做:`docker run --rm ...`,这样 docker 将删除这些新创建的、现在已停止的容器:) (2认同)