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
というフォーク実行を要求するシステムコールを受け取り、期待通りに、コンテナプロセスが見ることができるファイルシステム内のバイナリを探します。
これは明らかではないのでしょうか...ポイントは、hteの新しい名前空間のPIDツリーではなく、ホストのPID階層を経由してビンの場所に到達したいということです。実行可能なビンの「非常に絶対的な」パス、つまりホストマシン上のパスが必要です。 –
ドッカーの内部に入室しています。あなたのホストに直接パスはありません。 Dockerは、ホストから簡単に検査できない階層化されたストレージを使用します。これは、ドッカーセットアップで使用するストレージドライバによって異なります(https://docs.docker.com/engine/userguide/storagedriver/selectadriver/)。 – Robert
chrootに似たマウント名前空間もあります。パスはホストからはほとんど役に立たない。あなたはそれを 'sudo find/var/lib/docker -name nsnake -type f'で見つけることができます –