Docker容器内运行的程序的二进制文件在哪里?
我基于Ubuntu部署容器:16.04Docker容器内运行的程序的二进制文件在哪里?
docker run -ti ubuntu:latest /bin/bash
我已经从易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的二进制文件的位置?
其他有趣的问题是:
- 为什么符号链接是 “破”?
- 如果在相关的/ proc/PID/exe文件中没有引用原始文件夹,系统如何知道它需要运行哪些代码?
Q.为什么符号链接是“破”的?
您正在将主pid命名空间与容器的pid命名空间混合。它在你的主机中被破坏了,但从容器的角度来看它并没有被打破。
PID命名空间提供进程分离。该PID空间中移除系统进程的看法,并允许进程号,包括PID被重用1.
https://docs.docker.com/engine/reference/run/
做,你在你的主机做同样的,但做到这一点的容器内。您将看到nsnake
的pid
(进程ID)是不同的数字。里面的容器中的符号链接未破:
# 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.如果在相关的/ proc/PID/exe文件中没有引用原始文件夹,系统如何知道它需要运行哪些代码?
运行集装箱的过程(在你的例子/bin/bash
)看到自己的文件系统,安装在由泊坞窗为您提供:
# Inside the container
[email protected]:/# 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"。从内核/bin/bash
收到的Linux内核会处理系统调用,请求执行/usr/games/nsnake
的叉,并且如期望的那样,它将在容器进程可以看到的文件系统中查找该二进制文件。
好吧,也许这个问题不清楚......关键是我想要通过宿主的PID层次结构来达到容器位置,而不是通过新命名空间的PID树。我需要可执行程序的“非常绝对”路径,主机上的路径。 –
您正在进入码头内部。主机中没有直接路径。 Docker使用不容易从主机上检查的分层存储。这也取决于您的docker设置使用的存储驱动程序:https://docs.docker.com/engine/userguide/storagedriver/selectadriver/。 – Robert
还有挂载名称空间,类似于chroot。主机的路径通常是无用的。你可以用'sudo find/var/lib/docker -name nsnake -type f'找到它 –