主机卷中的符号链接如何在 Docker 容器中工作?

How do symlinks in a host volume work in Docker containers?

我的问题是当您从主机挂载目录中的容器内部创建 symlink 时会发生什么。举个例子问最简单

假设我们像这样启动一个容器。大多数命令都无关紧要,这里重要的是主机卷挂载。

docker run --rm -ti -h thecontainer -v /home/userguy:/container-home alpine /bin/sh

在容器中,我在主机卷目录

中创建了一个符号link
thecontainer$ ln -s /tmp /container-home/tmp-link

在容器中时,我可以 ls /container-home/tmp-link 并按预期看到容器 /tmp 的内容。

现在,如果我回到我的主机,我会看到 link /home/userguy/tmp-link -> /tmp。如果我 ls 该目录,我会看到 主机的 /tmp 的内容。即不同的结果。

我的问题是,主机卷如何在允许这种情况下工作的幕后工作?这是 Docker 的产品还是 lxc 本身?我很惊讶地看到这项工作,因为我认为 symlinks 指向 inode 并假设容器中的 /tmp 与主机上的 /tmp 不同。

它是 OS 的虚拟文件系统层的一部分。符号链接包含名称,VFS 在访问符号链接时动态解析该名称。

指向 inode 的指针称为 链接,通常称为 "hardlinks" 以区别于符号链接。