我已经部署了一个基于 ubuntu:16.04 的容器
docker run -ti ubuntu:latest /bin/bash
我已经从容器中的/bin/Bash 中的 apt nsnake 下载了一个游戏:
apt install nsnake
我的主机上没有这样的游戏。
现在我想知道 nsnake 的二进制文件在哪里 在主机上 ;
在主机上:
ps -e | grep nsnake
然后,取PID:
file /proc/PID/exe
但是 而不是返回/proc/PID/exe 指向的文件,最后一个命令给了我:
/proc/PID/exe: broken symbolic link to /usr/games/nsnake
所以,重要的问题是:
有没有办法找到 nsnake 二进制文件的位置?
其他有趣的问题是:
最佳答案
Q. why symlink is "broken " ?
您正在将主 pid 命名空间与容器的 pid 命名空间混合。它在您的主机中已损坏,但从容器的角度来看并没有损坏。
PID namespace provides separation of processes. The PID Namespace removes the view of the system processes, and allows process ids to be reused including pid 1.
https://docs.docker.com/engine/reference/run/
执行与您在主机中执行的操作相同的操作,但在容器中执行此操作。您将看到
pid
nsnake
的(进程 ID)是一个不同的数字。在您的容器内,符号链接(symbolic link)没有损坏:# docker exec -it <container-id> file /proc/231/exe
/proc/231/exe: symbolic link to /usr/games/nsnake
(您需要在容器内安装文件实用程序
apt-get install file
,或者直接执行 ls -l /proc/PID/exe
)文件:
https://en.wikipedia.org/wiki/Linux_namespaces#Process_ID_.28pid.29
Q. if there is no reference to original bins inside the related /proc/PID/exe , how do the system know what code it has to run ?
正在运行容器化的进程(在您的示例中
/bin/bash
)会看到由 docker 为您安装的自己的文件系统:# Inside the container
root@d0fb6fdea3b5:/# mount
overlay on / type overlay (rw,relatime,lowerdir=/var/lib/docker/overlay2/l/4FPUTTI4XND27BPHH7FS4JKJ4V:/var/lib/docker/overlay2/l/U65SX2N4JGA5X6TXGRJQERQWNX:/var/lib/docker/overlay2/l/OEX7NG4TZRGXBBFSSQ7Q3FXC5R:/var/lib/docker/overlay2/l/FXRLO27CABA4ZFNOFTOL2HFHP4:/var/lib/docker/overlay2/l/KBEK646A7PRLHLWM6CVJRMXSEH:/var/lib/docker/overlay2/l/PSRBIMSE36LW2MZEOSMM3XDG2Y,upperdir=/var/lib/docker/overlay2/5b867408de3a3915bc5f257aecaf73193083b3c8cc84c5d642810a3eaaeef550/diff,workdir=/var/lib/docker/overlay2/5b867408de3a3915bc5f257aecaf73193083b3c8cc84c5d642810a3eaaeef550/work)
...
在这种情况下,存储驱动程序是 "overlay2" . Linux 内核从
/bin/bash
接收处理要求 fork 执行 /usr/games/nsnake
的系统调用正如预期的那样,它将在容器进程可以看到的文件系统中查找该二进制文件。
关于docker - 在 Docker 容器中运行的程序的二进制文件在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44891222/