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

标签 docker

我已经部署了一个基于 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/

    相关文章:

    regex - 对多个文件使用 Docker ADD 命令

    shell - Docker 运行后配置的最佳方式

    docker - Docker引擎群模式下跨多个节点的持久卷

    mysql - 我如何从Docker访问数据库?

    docker - 如何重新定位移动到不同目录的 DDEV 项目?

    docker - 如何配置Docker容器以使用VPN访问它们?

    docker - WSO2 : how to download products in a Dockerfile?

    docker - Docker的新手,看不到现场进行的本地更改

    docker - 如何将 GitLab CE CI 设置为运行者的用户 docker 图像

    docker - 如何在 Next.js 中访问系统环境变量?