主机是否可以遵循符号链接进入docker容器?

jpfvwuh4  于 2023-04-29  发布在  Docker
关注(0)|答案(1)|浏览(146)

问题

我想创建一个docker容器并绑定挂载一个本地文件夹,e.例如:

docker -it run --mount type=bind,src=$(pwd),dst=/data busybox sh

然后我想:
1.在/data中创建一个新的符号链接,链接到挂载外部的文件(例如:g. /data/abinary -> /usr/local/bin/abinary
1.退出容器
1.从主机访问新创建的符号链接(即使它解析为挂载外的文件)
使用Docker可以吗?

上下文

背景是我有一个带有Python环境的Docker容器。我希望能够从我的主机访问python二进制文件,即使我访问的文件是挂载外部文件的符号链接。
或者换句话说,我希望以下两个命令在从主机运行时执行相同的操作:

./python
docker exec -it mycontainer /data/python
rmbxnbpk

rmbxnbpk1#

Docker容器有一个独立的文件系统。容器无法访问主机上的文件(没有绑定装载),主机也无法访问容器中的文件。特别是,使用您描述的设置,主机无法直接调用容器中的Python安装。
符号链接将文件名存储为目录项。在Docker绑定挂载的情况下,如何解释它取决于您查看的是主机还是容器文件系统。
您可以通过创建一个包含符号链接的主机目录来演示这一点,然后将其绑定挂载到运行不同发行版的容器中,并查看它的作用。

$ mkdir x
$ ln -s /usr/bin/more x

$ ./x/more --version # on a MacOS host
less 581.2 (POSIX regular expressions)

$ docker run --rm -v "$PWD/x:/x" ubuntu /x/more --version
more from util-linux 2.37.2

$ docker run --rm -v "$PWD/x:/x" busybox /x/more --version
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "/x/more": stat /x/more: no such file or directory: unknown.

$ docker run --rm busybox /bin/more --version
/bin/more: unrecognized option `--version'
BusyBox v1.34.1 (2022-03-10 23:58:34 UTC) multi-call binary.

因此,我们在这里创建了一个指向/usr/bin/more的符号链接。在主机上运行它将返回more的主机版本;在Ubuntu容器中,它的util-linux版本;而在BusyBox容器中,则是一个错误(因为该工具实际上位于/bin中)。在任何情况下,符号链接都不会从容器文件系统交叉到主机,反之亦然。

相关问题