这个选项到底有什么作用?我读了很多关于TTY的文章,但我还是很困惑。我没有使用-t,只使用-i,看起来程序需要用户输入而不使用-t就会抛出错误。为什么启用伪tty很重要?
当前回答
在linux中,当你运行一个命令时,你需要一个终端(tty)来执行它。
因此,当你想要连接到docker(或在docker容器中运行命令)时,你必须提供选项-t,它考虑到docker容器中的终端。
其他回答
Docker在线文档中提到它是“分配一个伪tty”,经常与-i一起使用:
https://docs.docker.com/reference/run/
我在jwilder/nginx-proxy docker容器的文档中看到它是这样使用的:
docker run -d -p 80:80 --name nginx -v /tmp/nginx:/etc/nginx/conf.d -t nginx
在这种情况下,它所做的是将输出发送到docker容器中的“虚拟”tty (Bash命令提示符/终端)。然后,您可以通过运行docker命令docker logs CONTAINER查看此输出,其中CONTAINER是容器ID的前两个字符。这个CONTAINER ID可以通过输入docker ps -a找到
我在下面的链接中看到了这个-t参数,它说
-t和-i标志分配一个伪tty并保持stdin打开 如果没有附上。这将允许您使用容器像 只要bash提示符在运行。
https://coreos.com/os/docs/latest/getting-started-with-docker.html
-it指示Docker分配一个伪tty连接到容器的stdin,在容器中创建一个交互式bash shell。
——interactive, -i false保持STDIN打开,即使没有附加
——tty, -t false分配一个伪tty
https://docs.docker.com/engine/reference/commandline/run/
在linux中,当你运行一个命令时,你需要一个终端(tty)来执行它。
因此,当你想要连接到docker(或在docker容器中运行命令)时,你必须提供选项-t,它考虑到docker容器中的终端。
我对-t的了解如下:
docker exec -ti CONTAINER bash允许我在容器中“登录”。感觉像嘘嘘(其实不是)。
但问题是当我想恢复数据库时。
通常我dodocker exec -ti mysql.5.7 mysql -这里我在容器中执行mysql命令并获得一个交互式终端。
我添加了<dump。sql到前面的命令,以便我可以恢复一个db。但是它失败了,不能在非tty输入上启用tty模式。
删除-t会有所帮助。还是不明白为什么:
docker exec -i mysql.5.7 mysql < dump.sql
最后一个可行。希望这能帮助到人们。
-it组合选项称为交互模式。
默认情况下,容器只有一个标准输出流(即docker run | CMD works),要与我们的容器交互,我们需要以下两个选项:
-i添加一个stdin流(即CMD | docker run works); -t分配一个伪tty主/从对,从部分绑定到容器中正在运行的进程,主部分绑定到docker命令。
stdin流将容器附加到您的shell的stdin流(docker继承了您的shell的stdin流),而TTY行规程使您能够以键盘方式与容器交互。
TTY行规程由内核提供给TTY设备的低级特性组成,例如编辑缓冲区和基本的行编辑命令。
如下所示,您可以使用以下命令检查标准文件描述符:
docker run --rm -i ubuntu sh -c "ls -l /proc/\$\$/fd"
如果你移除-i,你会看到stdin指向/dev/null(也就是说,没有分配流)。
推荐文章
- E: gnupg, gnupg2和gnupg1似乎没有安装,但是这个操作需要其中一个
- 如何从docker更改默认docker注册表。IO到我的私人注册表?
- Docker- compose无法连接到Docker Daemon
- 单个命令停止和删除docker容器
- 使用GPU从docker容器?
- 如何使用本地映像作为dockerfile的基本映像?
- 谁能解释一下docker.sock
- 多重from是什么意思
- 通过映像名称停止Docker容器- Ubuntu
- 如果dockerfile的名称不是dockerfile,我如何构建一个dockerfile ?
- 守护进程的错误响应:已被集装箱使用"
- 如何从DockerFile运行docker实例?
- 我是否试图连接到启用TLS的没有TLS的守护进程?
- Docker -一种访问主机USB或串行设备的方法?
- Docker:无效引用格式