当前位置: 首页 > 面试题库 >

“ docker exec”命令的“ -i”和“ -t”选项的作用是什么?

松阳泽
2023-03-14
问题内容

说实话,我一直感到困惑docker exec -it …docker exec -i …并且docker exec -t …,所以我决定做一个测试:

  1. docker exec -it …
    # docker exec -it 115c89122e72 bash
    

    root@115c89122e72:/# ls
    bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

它正常工作。

  1. docker exec -i …
    # docker exec -i 115c89122e72 bash
    

    ^C

该命令挂起,我必须使用Ctl+ c来中断它。

  1. docker exec -t …
    # docker exec -t 115c89122e72 bash
    

    root@115c89122e72:/# ls
    ^C

它成功进入容器,但挂起执行第一个命令。

因此,似乎没有必要使用docker exec -i …and docker exec -t …命令。谁能详细说明为什么存在该命令-i及其-t选项docker exec


问题答案:

-i--interactive即使没有连接,也可以保持STDIN处于打开状态,如果您完全想键入任何命令,都需要打开。

-t--tty分配一个伪TTY,一个伪终端,它将用户的“终端”与stdin和stdout连接起来。(请参阅container/container.go

如果执行回显,则仅-t需要。
但是对于在其中输入输入的交互式会话,则需要-i

由于-i保持stdin处于打开状态,因此还可以使用它来将输入通过管道传递到分离的docker容器。即使使用-d(分离)也可以。

$ echo hello | docker run -i busybox cat
  hello

-i 即使未连接STDIN也保持打开状态,在这种情况下STDOUT的状态是什么?

它是docker exec由设置的docker run

但是,关于docker exec,存在一个当前问题(问题8755:Docker
tty不是具有docker exec

不幸的是,您的发现仅相当于tty在centos6与ubuntu:14.04之间的行为差​​异。exec内仍然没有功能性tty-只需执行一下ls -la /proc/self/fd/0,看看它是指向a pts不存在的断开链接。

我们正在处理的实际错误是某些标准库假定/ proc / self / fds /中的符号链接必须是有效的符号链接。

问题在于,tty是在主机外部创建的,在容器中没有对它的引用,就像/dev/console在主容器中如何设置一样。
解决此问题的一种方法是分配并将绑定devpts从主机装入到容器中。

注意(2017年第四季度):该问题现在应该已修复(docker
17.06-ce)。
参见PR 33007。

该PR现在允许(自17.06起):

zacharys-pro:dev razic$ docker run --rm -t -d ubuntu bash
83c292c8e2d13d1b1a8b34680f3fb95c2b2b3fef71d4ce2b6e12c954ae50965a

zacharys-pro:dev razic$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
83c292c8e2d1        ubuntu              "bash"              2 seconds ago       Up 1 second                             xenodochial_bardeen

zacharys-pro:dev razic$ docker exec -ti xenodochial_bardeen tty
/dev/pts/1

(在17.06之前,tty返回“ not a tty”)



 类似资料:
  • 问题内容: 当我阅读docker / distribution源代码的副本时,我发现有声明的变量使我很困惑。 代码是: 我不知道声明是什么意思,希望能得到一些帮助。 问题答案: 从常见问题解答: 您可以通过尝试分配,要求编译器检查类型T是否实现了接口I: 在这种情况下,空白标识符_代表此处不需要的变量名(从而防止出现“已声明但未使用”错误)。 规格中的更一般性: 空白标识符提供了一种忽略分配中右侧

  • 命令是做什么的?我知道其他命令是做什么的,比如开始、构建、测试。但是不知道弹射。

  • jlink压缩选项是做什么的?oracle留档对此不是很详细: 压缩的资源是什么?有什么缺点吗?

  • 问题内容: 我是Docker的新手。我在docker run命令中找不到对此选项的任何清晰描述,对此有些困惑。 我们可以使用它来访问在docker容器上运行的应用程序而无需指定端口吗?例如,如果我使用docker run命令中的选项运行通过端口8080中的docker映像部署的webapp ,我知道我将必须在Docker容器ip / theWebAppName的8080端口上访问它。但是我真的无法

  • 问题内容: 我已成功使用以下命令在Linux中搜索/替换文本: 但是,当我在Mac OS X上尝试时,得到: “命令c期望\后跟文本” 我以为Mac运行的是普通的BASH shell。这是怎么回事? 编辑: 根据@High Performance,这是由于Mac 具有不同的(BSD)风格,因此我的问题将是如何在BSD中复制此命令? 编辑: 这是导致此情况的一个实际示例: 问题答案: 如果使用该选项

  • 我一直在研究一些涉及将ASCII值转换为字符串的问题。 如果我使用此代码,我会以的形式输出,这是意料之中的。 但是,如果我这样更改代码: 当我尝试编译它时,会显示以下错误: 两种代码之间的唯一区别是,在第1种代码中,我使用的是t=I‘a’ ,在秒时,<代码>t=t i“a” 。 有人能告诉我第二段有什么问题吗?