gpt4 book ai didi

docker - 在 Docker 容器中运行的程序的二进制文件在哪里?

转载 作者:行者123 更新时间:2023-12-02 19:08:33 30 4
gpt4 key购买 nike

我已经部署了一个基于 ubuntu:16.04 的容器

docker run -ti ubuntu:latest /bin/bash

我已经从容器中的/bin/Bash 中的 apt 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 二进制文件的位置?

其他有趣的问题是:
  • 为什么符号链接(symbolic link)“损坏”?
  • 如果相关/proc/PID/exe 中没有对原始 bin 的引用,系统如何知道它必须运行什么代码?
  • 最佳答案

    Q. why symlink is "broken " ?



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

    PID namespace provides separation of processes. The PID Namespace removes the view of the system processes, and allows process ids to be reused including pid 1.



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

    执行与您在主机中执行的操作相同的操作,但在容器中执行此操作。您将看到 pid nsnake 的(进程 ID)是一个不同的数字。在您的容器内,符号链接(symbolic link)没有损坏:
    # 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. if there is no reference to original bins inside the related /proc/PID/exe , how do the system know what code it has to run ?



    正在运行容器化的进程(在您的示例中 /bin/bash )会看到由 docker 为您安装的自己的文件系统:
    # Inside the container
    root@d0fb6fdea3b5:/# 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 接收处理要求 fork 执行 /usr/games/nsnake 的系统调用正如预期的那样,它将在容器进程可以看到的文件系统中查找该二进制文件。

    关于docker - 在 Docker 容器中运行的程序的二进制文件在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44891222/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com