docker run -d ubuntu bash
exec
登录到此容器中。事实上,我需要在bash脚本中完成以下操作:
docker run -it ubuntu bash
docker run -it centos bash
但是它不起作用。
docker run -d ubuntu bash
exec
登录到此容器中。docker run -it ubuntu bash
docker run -it centos bash
但是它不起作用。
-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
bash
持续运行的方法如下:docker run centos sleep inf
运行sleep
命令会使容器一直运行,从而不会退出。现在您可以随意使用docker exec
进入该容器。
在容器中启动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
。