2017-07-03 6 views
1

私はUbuntuのに基づいてコンテナに配備しました:I「は、コンテナ内の/ binに/ bashの内部では、apt nsnakeからダウンロードしたゲームをVEの16.04Dockerコンテナ内で実行されているプログラムのバイナリはどこにありますか?

docker run -ti ubuntu:latest /bin/bash 

を:

apt install nsnake 

とIそのようなゲームは私のホストではありません。

今、私は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. symlinkが「壊れている」のはなぜですか?

メインのpid名前空間とコンテナのpid名前空間を混在させています。あなたのホストでは壊れていますが、コンテナの視点からは壊れていません。

PID名前空間はプロセスの分離を提供します。 PID名前空間は、システムプロセスのビューを削除し、プロセスIDがpidを含めて再利用することを可能にする1

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

あなたのホストでやっている同じことをしますが、コンテナ内でそれを行います。 pid(プロセスID)がnsnakeであることがわかります。あなたのコンテナの中にシンボリックリンクが壊れていない:

# 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"です。 Linuxカーネルは、/bin/bashから、/usr/games/nsnakeというフォーク実行を要求するシステムコールを受け取り、期待通りに、コンテナプロセスが見ることができるファイルシステム内のバイナリを探します。

+0

これは明らかではないのでしょうか...ポイントは、hteの新しい名前空間のPIDツリーではなく、ホストのPID階層を経由してビンの場所に到達したいということです。実行可能なビンの「非常に絶対的な」パス、つまりホストマシン上のパスが必要です。 –

+0

ドッカーの内部に入室しています。あなたのホストに直接パスはありません。 Dockerは、ホストから簡単に検査できない階層化されたストレージを使用します。これは、ドッカーセットアップで使用するストレージドライバによって異なります(https://docs.docker.com/engine/userguide/storagedriver/selectadriver/)。 – Robert

+0

chrootに似たマウント名前空間もあります。パスはホストからはほとんど役に立たない。あなたはそれを 'sudo find/var/lib/docker -name nsnake -type f'で見つけることができます –

関連する問題