如何在挂载文件夹后保留其所有权

75次阅读
没有评论

问题描述

在将一个文件夹 “Folder1” 挂载到容器中时,发现容器内的 “Folder1” 的所有权发生了变化,变为了 root 用户的所有权。这导致容器内的应用程序无法访问该文件夹。用户想知道如何解决这个问题。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

nix 系统中,挂载文件系统上的文件夹的所有权(即 uid 和 gid)不会发生变化,它是来自导出该文件系统的主机的实际所有权(如果该文件系统支持所有权)。
需要注意的是,如果容器具有与文件/文件夹的 uid/gid 匹配的不同用户/组名称,它们将以容器的名称出现在 ls -l 中,而不是主机的名称(如果没有容器名称与相应的 ID 匹配,则显示为数字)。
因此,如果在主机上该文件夹的所有者是 root,那么在容器中它也将由 root 拥有(换句话说,它被 root 拥有并没有什么“特殊”之处)。唯一允许容器应用程序写入文件系统的方法是在主机系统上相应地更改所有权(或给予 other 写入权限)。
值得注意的是,如果主机的文件系统本身不支持所有权,仍然可以在容器内使用 uid 和 gid 挂载选项来“伪造”所有权(在
nix 系统中)。参见 Ownership of a mount point

方案2

如果你不想更改主机上文件夹的所有权,或者希望容器以用户身份运行并访问由 root 拥有的主机文件夹,而不更改任何一方的所有权,可能需要使用其他方法来解决这个问题。
一种方法是在容器内运行应用程序时,使用 gosusu-exec 等工具来切换用户身份。这样,应用程序将以指定的用户身份运行,并且可以访问由 root 拥有的文件夹。
以下是一个示例脚本,演示了如何在容器内使用 gosu 切换用户身份:

#!/bin/bash
# 安装 gosu
apt-get update && apt-get install -y gosu
# 切换用户身份并运行应用程序
gosu your_user_name your_application_command

在上面的示例中,我们首先使用 apt-get 命令安装了 gosu 工具。然后,使用 gosu 命令切换到指定的用户(your_user_name),并运行应用程序的命令(your_application_command)。
请注意,你需要根据你的实际情况修改脚本中的用户名称和应用程序命令。

方案3

如果你无法更改主机上文件夹的所有权,并且在容器内切换用户身份也不可行,可能需要考虑使用其他方法来解决这个问题。
一种方法是在容器内创建一个新的用户,并将该用户添加到与主机上文件夹所有者相同的组中。然后,将容器内的应用程序配置为以该用户身份运行。
以下是一个示例脚本,演示了如何在容器内创建新用户并配置应用程序以以该用户身份运行:

#!/bin/bash
# 创建新用户
useradd -m -s /bin/bash your_user_name
# 将新用户添加到与主机上文件夹所有者相同的组中
usermod -a -G your_group_name your_user_name
# 配置应用程序以以新用户身份运行
su - your_user_name -c "your_application_command"

在上面的示例中,我们首先使用 useradd 命令创建了一个新用户(your_user_name),并指定了用户的主目录和默认 shell。然后,使用 usermod 命令将新用户添加到与主机上文件夹所有者相同的组中(your_group_name)。最后,使用 su 命令切换到新用户,并运行应用程序的命令(your_application_command)。
请注意,你需要根据你的实际情况修改脚本中的用户名称、组名称和应用程序命令。

正文完