2017-07-03 303 views
1

我基于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文件中没有引用原始文件夹,系统如何知道它需要运行哪些代码?

回答

2

Q.为什么符号链接是“破”的?

您正在将主pid命名空间与容器的pid命名空间混合。它在你的主机中被破坏了,但从容器的角度来看它并没有被打破。

PID命名空间提供进程分离。该PID空间中移除系统进程的看法,并允许进程号,包括PID被重用1.

https://docs.docker.com/engine/reference/run/

做,你在你的主机做同样的,但做到这一点的容器内。您将看到nsnakepid(进程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的叉,并且如期望的那样,它将在容器进程可以看到的文件系统中查找该二进制文件。

+0

好吧,也许这个问题不清楚......关键是我想要通过宿主的PID层次结构来达到容器位置,而不是通过新命名空间的PID树。我需要可执行程序的“非常绝对”路径,主机上的路径。 –

+0

您正在进入码头内部。主机中没有直接路径。 Docker使用不容易从主机上检查的分层存储。这也取决于您的docker设置使用的存储驱动程序:https://docs.docker.com/engine/userguide/storagedriver/selectadriver/。 – Robert

+0

还有挂载名称空间,类似于chroot。主机的路径通常是无用的。你可以用'sudo find/var/lib/docker -name nsnake -type f'找到它 –

相关问题