2017-07-03 300 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'找到它 –

相關問題