docker执行官。 如果没有shell进程呢?

docker exec <container> <command> 。 在文档中写道:

在正在运行的容器中运行命令

但究竟是什么意思? 在容器中执行一个命令是什么意思? 我无法想象一个情况, exec命令是由在容器中运行的shell执行的。 但是我们不能假定每个容器都有整个运行的shell或shell。

docker exec <container> <command>将在指定容器的命名空间中运行给定的命令。 docker exec创build新的进程并将其名称空间设置为容器的名称空间,然后执行命令。

有关Linux命名空间的更多信息,请访问: 命名空间

进程的命名空间可以使用以下命令find:

sudo ls -l /proc/<PID>/ns

当我想进入容器并查看里面发生了什么时, docker exec <container> command对我很有用。

docker exec -it <container> sh

或者在某些情况下,我需要移动或查看我正在运行的应用程序中的configuration文件

docker exec <container> ls /root/config_files/

即使在像alpine:latest这样的微型容器中alpine:latest你已经在里面了,它是默认的入口点/bin/sh -c

docker run alpine echo "hola mundo"

容器是一个独立的进程环境,具有自己的networking环境,挂载的文件系统,命名空间的进程列表等等。当你执行docker run ,通过运行命令pid 1来创build这个命名空间。当你执行一个docker exec可以在这个相同的命名空间内运行任何命令。 例如:

 $ docker run --name test-exec -d busybox tail -f /dev/null 5e77cec13293e7146dac6858ed11be1e6a706ba973c419435303f4ec8c346e2d $ docker exec test-exec ps -ef PID USER TIME COMMAND 1 root 0:00 tail -f /dev/null 6 root 0:00 ps -ef 

请注意,在上述命令中,我甚至没有运行过shell。