如何在Docker中以分离模式运行Bash?

5

docker run -d ubuntu bash

容器将立即退出。我需要的是保持容器运行,并且可以使用exec登录到此容器中。
事实上,我需要在bash脚本中完成以下操作:
docker run -it ubuntu bash
docker run -it centos bash

但是它不起作用。


docker run -ti --rm ubuntu sh -c "while true; do echo foo; sleep 1 ; done" 将在Docker中运行一个Ubuntu容器,并执行一个死循环,每秒钟打印一次“foo”。 - dormi330
3个回答

7
另一个选择是同时使用-i-d选项(我本来以为它们是互斥的,但惊讶地发现它们不是)
请参见下面的示例输出,我使用-itd标志启动了一个Ubuntu容器,然后等了几分钟并运行docker ps确认容器仍在运行。
> docker run -itd ubuntu
03c55e9ba9de3e0b80ad9f3e0629dc63f4ab65291b79e133af2b392030ffc17d

> docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
03c55e9ba9de        ubuntu              "/bin/bash"         2 minutes ago       Up 2 minutes                            gallant_hypatia

4
为什么要持续运行 bash?一个简单的解决方案是: bash 持续运行的方法如下:
docker run centos sleep inf

运行sleep命令会使容器一直运行,从而不会退出。现在您可以随意使用docker exec进入该容器。


1
我希望Docker在命令之间保持状态。也许有更好的工具可以做到这一点? - Jacques Kvam

0

在容器中启动bash,然后使用exec进入它是没有意义的。您可以运行sleep infinity来达到相同的效果(例如:docker run -d alpine sleep infinity)。因为当您执行exec时,会在容器中启动另一个进程。您的bash进程将被浪费(未被使用)。

如果您想在容器中运行交互式进程(例如:sh),以便稍后能够附加到它:

$ docker run --rm -itd alpine sh
e2ea4dd1fea30cc91cb27b3bca7d6cbc9718063ef602a02bbea9aa2f7dbf2a3b

$ docker exec -it e2ea4dd1fea30cc91cb27b3bca7d6cbc9718063ef602a02bbea9aa2f7dbf2a3b sh
/ # ps
PID   USER     TIME  COMMAND
    1 root      0:00 sh
    6 root      0:00 sh
   12 root      0:00 ps
/ # <Ctrl-P><Ctrl-Q>

$ docker attach e2ea4dd1fea30cc91cb27b3bca7d6cbc9718063ef602a02bbea9aa2f7dbf2a3b
/ # ps
PID   USER     TIME  COMMAND
    1 root      0:00 sh
   13 root      0:00 ps
/ #

--rm 选项会在容器停止后自动删除它。通常需要使用 -it 选项来运行交互式进程。

如果你在连接到容器后运行 exit 命令(或按下 Ctrl-D),则 shell 将退出,容器也将停止。如果你想要分离但保持容器运行,请按下 Ctrl-P Ctrl-Q


你假设发帖者想要使用正在运行的bash,我不明白为什么需要这样做。我基本上想要相同的东西:通过docker exec在一个活着的容器上运行sed命令。因此,任何可以保持容器运行而不启动应用程序的方法都对我和发帖者来说都是好的。-id选项正是我所需要的。 - Vincent Gerris
@VincentGerris 希望我的编辑消除了你的假设的根据。 - x-yuri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接