【问题标题】:Docker interactive tty attach detach options real meaning?Docker 交互式 tty attach detach 选项的真正含义?
【发布时间】:2022-01-10 09:22:35
【问题描述】:

我正在使用docker run --name cont -dt img 运行一个容器。据我了解,这为容器提供了一个 tty,但不会将我的主机终端的 stdout、stderr 和 stdin 附加到也在后台运行的容器。

现在我想如果我这样做了docker attach cont(docker 文档说它将 stdio 附加到正在运行的容器,attach)我会获得相同的效果(通过首先运行 docker logs cont 在提示之前查看 stdout)运行docker run --name cont -it img(显示stdout/sterr 分配一个tty 并将stdin 连接到容器)。但是我的主机终端附加但只是挂起,必须使用ctrl+c 分离(ctrl+p+q 不起作用)。

我想了解为什么attach 不能按我的预期工作?我的意思是它背后的真正逻辑以及如果可能的话你是如何理解这一点的,我知道运行 cont 和选项 -dit 并重新附加是可行的。如果有人有提示或可以指出一些阅读资源来理解这一点,那将有很大帮助。谢谢!

Dockerfile

FROM ubuntu:latest

RUN apt update -y
COPY . /tmp
WORKDIR /tmp
CMD ["/tmp/app.sh"]

app.sh

#!/bin/sh
echo "Enter your name: "
read name
echo "Hello ${name}!"

【问题讨论】:

    标签: docker io containers


    【解决方案1】:

    没有-i,您还没有将标准输入连接到容器。您仍然会看到任何使用 tty 的格式化输出,但它只是 stdout/stderr。根据您的实验,分离信号 (cont-P cont-Q) 需要连接该标准输入以进行处理。有关-it 标志的更多信息,请参阅this answer

    【讨论】:

    • docker attach cont 应该按照文档中的说明将标准输出/标准错误/标准输入从主机连接到客户机。那是我不明白的。
    • @lucmobz 如果存在标准输入,它将附加标准输入,但在没有该选项的情况下创建容器时不存在该标准输入。
    • 好吧,这是有道理的,但是关于 docker attach 的文档我发现真的很混乱,因为它没有提到 attach if it exists
    • 然而,如果我运行docker run --name cont -a stdin -it img(我假设是附加标准输入而不是标准输出/斯特尔)仍然令人困惑,我可以输入不显示的内容(这是有道理的,因为没有标准输出),可以按回车键,从另一个终端我看到容器已停止,但我的终端仍然挂起。相反,如果我使用ctrl+p+q 分离,它可以工作(因为我使用了-it)并执行docker attach cont 现在我可以输入并按Enter,它将显示标准输出(废话,因为我没有在开始时使用标准输出运行容器) .非常令人费解。不过感谢您的回答。
    • @lucmobz 可能是个 bug,代码在 moby/moby 和 docker/cli 下开源。
    猜你喜欢
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2014-12-18
    • 2014-07-01
    • 2020-01-14
    • 2012-08-22
    • 1970-01-01
    相关资源
    最近更新 更多