Ale*_*lex 64 docker dockerfile
我正在用docker做一些复杂的事情,但结果我不知道-it
标志是什么意思.最近我遇到了一些令docker run
我困惑的命令的例子.
docker run -itd ubuntu:xenial /bin/bash
Run Code Online (Sandbox Code Playgroud)
我的问题是-it
,如果在实例化期间运行容器,那么在这里写标志是有意义的bin/bash
在文档中我们有一个例子
docker run --name test -it debian
Run Code Online (Sandbox Code Playgroud)
有解释
-it指示Docker分配连接到容器的stdin的伪TTY; 在容器中创建交互式bash shell.
和帮助页面中-t标志的说明
-t, - try分配伪TTY
如果我删除-it标志期间
docker run -d ubuntu:xenial /bin/bash
Run Code Online (Sandbox Code Playgroud)
我新创建的容器并没有那么多
在 docker ps -a
它被指定为退出
对不起,如果我的问题很愚蠢,我在互联网上找不到解释(我对这一点有很大的误解).
Fen*_*iko 65
-it
--interactive + --tty
当你docker run
使用这个命令时它很简短..它会直接带你到容器里面,这里-d
很短,--detach
这意味着你只需要运行容器,然后从中分离,所以基本上你在后台运行容器..
编辑:所以如果您使用-itd
它运行docker容器将运行-it
选项并将您从容器中分离,因此即使没有任何默认应用程序运行,您的容器仍然在后台运行..
dvn*_*yen 30
docker run -it ubuntu:xenial /bin/bash
以交互模式启动容器(因此-it
标记),允许您与/bin/bash
容器进行交互.现在这意味着你将有bash
会话内部的容器,这样你就可以ls
,mkdir
或者做容器内任意bash命令.
这里的关键是"互动"这个词.如果省略该标志,则容器仍会执行/bin/bash
但会立即退出.使用该标志,容器执行/bin/bash
然后耐心地等待您的输入.
Dav*_*vid 10
没有任何标志的正常执行:
[ec2-user@ip-172-31-109-14 ~]$ sudo docker exec 69e937450dab ls
bin
boot
dev
docker-entrypoint.d
docker-entrypoint.sh
etc
Run Code Online (Sandbox Code Playgroud)
如果你的命令需要像 cat 这样的输入,你可以尝试:
[ec2-user@ip-172-31-109-14 ~]$ echo test | sudo docker exec 69e937450dab cat
Run Code Online (Sandbox Code Playgroud)
什么也不会显示,因为没有输入流进入 docker 容器。这可以通过 -i 标志来实现。
[ec2-user@ip-172-31-109-14 ~]$ echo test | sudo docker exec -i 69e937450dab cat
test
Run Code Online (Sandbox Code Playgroud)
现在,让我们假设,您希望 bash 作为进程启动:
sudo docker exec 69e937450dab bash
Run Code Online (Sandbox Code Playgroud)
您将看不到任何内容,因为该进程是在容器中启动的。添加标志就可以了:
[ec2-user@ip-172-31-109-14 ~]$ sudo docker exec -t 69e937450dab bash
root@69e937450dab:/#
Run Code Online (Sandbox Code Playgroud)
但这并没有真正的帮助,因为我们需要一个输入流,它接受我们的命令并可以被 bash 接收。因此,我们需要将两者结合起来:
[ec2-user@ip-172-31-109-14 ~]$ sudo docker exec -i -t 69e937450dab bash
root@69e937450dab:/# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc hi home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@69e937450dab:/#
Run Code Online (Sandbox Code Playgroud)
小回顾:
-t 用于将 bash 进程附加到我们的终端
-i 能够通过 STDIN 发送输入,例如使用键盘发送到容器中的 bash
没有 -i 可以用于不需要输入的命令。当您不想将 docker 容器进程附加到 shell 时,可以使用没有 -t 和 bash 的选项。
Isk*_*4yo 10
我想为像我这样的新手添加一些直觉。
-it
是命令的标志docker run
或docker container run
(它们是别名)。建议您了解什么是标志并继续:
-i
或--interactive
:docker run -i
这意味着您的终端会将您的输入传输到容器(容器中的应用程序),直到您按ctrl-D
(离开容器)。例如,如果某个应用程序在等待用户输入的容器中运行,您可以输入一些内容,该内容将被转发到该应用程序。-t
或-tty
(伪 TTY):bin/bash
,尝试使用ls
和不使用-t
标志),但有时更重要,因为某些应用程序根据是否通过终端启动来改变其行为(例如,文本编辑器或屏蔽密码的机制)和*
终端实现)。将两个标志组合为-it
使您有机会使容器获取标准输入并从容器获得良好的格式化输出,就像您正在使用漂亮的本机自己的终端一样。
后续行动:
docker run -i <image> <app>
,最后一个参数 ( <app>
) 将获取您的输入。-i
当您想与容器中的应用程序交互时很有用,但获取格式化输出对您来说并不重要。例如,您想要将数据发送到容器,从中获取数据并将其保存到文件中。在这种情况下-t
是没有必要的。echo "my input" | docker run -i <image> > output.txt
Run Code Online (Sandbox Code Playgroud)
-t
当您想要类似终端的输出但不需要将输入传输到容器时非常有用。假设您有一个在容器内启动的脚本,以特定格式输出数据,然后该数据被另一个脚本使用:docker run -t my-image | my-processing-script.sh
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
31265 次 |
最近记录: |