gpt4 book ai didi

linux - mac 上的 Docker 分离了内部和外部文件所有权;在 Linux 上不是这样

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:47:49 24 4
gpt4 key购买 nike

在 Mac 上使用 centos 图像运行 docker,我看到挂载的卷接管了 centos(内部)用户的所有权,而在文件系统上,所有权是我的(mdf:mdf)。

在 RHEL 7 上使用相同的 centos 镜像,我看到卷已安装,但在 centos 中,主目录和文件都显示我的 uid (1055)。

我可以对 insideguy:insideguy 进行递归 chown,看起来一切正常。但是回到主机文件系统,所有权已更改为注册表中的其他人,其 uid 与执行 useradd 时为 insideguy(1001) 选择的 uid 相同。

Linux 版 docker 中是否有一些基本限制导致这种情况发生?

作为另一个副作用,在我们的集群中,即使有 sudo 权限,也不能在挂载的文件系统上进行 chown;仅在本地文件系统上。因此,将 docker 主目录保留在 ~/dockerhome 中的愿望失败了,因为 docker 似乎正在尝试(并且失败)执行一些 chowns(在 Dockerfile 或启动脚本中没有描述,因此假设是--音量处理)。以适当的所有权放置在/var 或/opt 中,一切顺利。

知道这两个 docker 主机有什么不同吗?

规范:OSX 10.11.6; mac 上的 docker v1.12.1,RHEL 7 上的 v1.12.2;中心 7

最佳答案

导致这种情况发生的 OS X 上的 Docker 有一个基本限制:那就是 Docker 只能在 Linux 上运行。

在其他平台上运行 Docker 时,这需要首先设置一个 Linux VM(过去是通过 VirtualBox,尽管最近有其他选项可用),然后在该 VM 中运行 Docker。

因为 Docker 在 Linux 上本地运行,所以当您使用 docker run -v/host/path:/container/path 时,它会直接与主机共享文件系统。因此,如果在容器内运行 chown userA somefile 并且用户 A 的用户 ID 为 1001,并且在您的主机上该用户 ID 属于 userB,那么当然当您查看主机上的文件时,它们会出现归 userB 所有。这里没有魔法;这就是 Unix 文件权限的工作原理。例如,如果您要将磁盘或 NFS 文件系统从一台主机移动到另一台本地 /etc/passwd 文件中有冲突条目的主机,您会得到相同的行为。

大多数 Docker 容器都以 root 身份运行(或者至少不是您的本地用户)。这意味着 Docker 中的进程创建的任何文件通常归您所有,如果您尝试访问不允许此类访问的文件系统,这当然会导致问题。您在使用 Docker 时的选择与您在不使用 Docker 时的选择几乎相同:要么确保您以自己的用户身份运行容器——这可能是不可能的,因为许多镜像都是假设它们将以 root 身份运行的—— - 或安排将文件存储在其他地方。

这是许多人不鼓励使用主机卷挂载的原因之一,因为它会导致这种混淆(也因为在与远程 Docker API 交互时,远程 Docker 守护进程没有任何访问本地主机文件系统)。

对于 Mac 版 Docker,有一些神奇的文件共享可以将您的本地文件系统暴露给 Linux VM(例如,对于 VirtualBox,Docker 可以使用 shared folders 功能)。该转换层可能是您在 OS X 上注意到的与文件所有权相关的行为的原因。

关于linux - mac 上的 Docker 分离了内部和外部文件所有权;在 Linux 上不是这样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40165921/

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