docker Windows和Linux之间的setfacl行为与绑定挂载不一致[已关闭]

mec1mxoz  于 2023-10-16  发布在  Docker
关注(0)|答案(4)|浏览(137)

已关闭此问题为not about programming or software development。它目前不接受回答。

这个问题似乎不是关于a specific programming problem, a software algorithm, or software tools primarily used by programmers的。如果你认为这个问题与another Stack Exchange site的主题有关,你可以留下评论,解释在哪里可以回答这个问题。
昨天关门了。
Improve this question
setfacl在Windows(可能还有MacOS)和Linux之间的行为不一致。似乎setfacl不能用于Linux上绑定挂载的文件夹,只能用于Windows(可能还有MacOS)。
你可以用这个minimal repository自己试试。
给出:

  • folder-volume:Docker
  • folder-bind:Docker绑定挂载中的常规文件夹

问题
folder-volume上运行setfacl
setfacl -dR -m u:www-data:rwX -m u:"$(whoami)":rwX /workspace/folder-volume

  • Windows工作正常
  • Linux Linux工作正常

folder-bind上运行setfacl命令:
setfacl -dR -m u:www-data:rwX -m u:"$(whoami)":rwX /workspace/folder-bind

  • Windows工作正常
  • Linux Linux抛出错误 * 不支持 *

我在切换到Linux工作后看到了这一点。有没有人有办法,或者说是一样的?

gc0ot86w

gc0ot86w1#

不幸的是,setfacl不适用于绑定挂载。但您可以使用此方法将权限从原始文件夹复制到绑定挂载:

#!/bin/bash
# Getting permissions of original folder
perms=$(stat -c "%A" /workspace/folder-bind)

# Copying permissions to bind mount
chmod -R $perms /workspace/folder-bind

这将简单地将所有权限从原始文件夹复制到绑定挂载,然后为绑定挂载中创建的任何新文件设置默认权限。这样,对原始文件夹中权限的任何更改也将反映在绑定挂载中。
注意:这只是一种解决方法,可能不适用于所有场景。
使用文件系统权限而不是扩展文件夹来设置文件夹的umask-绑定到新创建文件夹的所需权限

mkdir -m 755 folder-bind

命令拥有所有新文件夹755权限,则规则仅适用于那些新创建的文件夹。你已经做的那些不会受到影响

gv8xihay

gv8xihay2#

以下是一些需要考虑的要点:
1.文件系统:
在Linux上,标准文件系统通常是ext4或类似的文件系统,它使用传统的POSIX file permissions (i.e., owner, group, and others)来控制访问。在Windows上,文件系统通常是NTFS,它使用访问控制列表(AccessControlLists,简称ACL)来管理权限。与POSIX权限相比,Windows权限更细粒度和更灵活。
1.绑定挂载:
在Windows系统和Linux系统之间创建绑定挂载时,这两个系统必须协商如何应用权限和ACLs,这可能导致不一致。

  1. setfacl命令:
    Linux上的setfacl命令用于管理POSIX ACLs。在Windows上,没有与setfacl命令直接等效的命令。Windows使用自己的安全机制,可能不直接与POSIX兼容。
    1.所有权和所有权:
    使用绑定装载时,Windows和Linux上文件的所有权和权限可能不会直接转换。解释权限的方式可以不同。
rqmkfv5c

rqmkfv5c3#

原因是Linux不支持在绑定挂载上设置挂载,而Windows和MacOS支持。
在Linux上,当您使用-v host_dir:container_dir(绑定挂载)将目录挂载到容器中时,不会保留主机目录挂载。
绑定装载将忽略主机上的挂起。
因此,当您尝试在容器内的绑定挂载目录上运行setfacl时,它会失败,并在Linux上显示“不支持”错误。
而在Windows和MacOS上,则会在绑定挂载中保留数据库。
因此,setfacl在Docker容器内的绑定挂载目录上按预期工作。
Linux上的解决方法是使用Docker卷而不是绑定挂载,正如您所演示的那样。
Docker卷支持Linux上的SetFacl,因此setFacl将按预期工作。

2w2cym1i

2w2cym1i4#

实际上,Linux用于设置传统Unix权限之外的权限,在Linux上,setfacl可能无法在绑定挂载的文件夹上按预期工作,因为底层文件系统可能不支持Linux,所以这可能是您收到Not supported错误的原因,但Windows或MacOS有自己的Linux实现,它们可能会以不同的方式工作,并支持绑定挂载的文件夹上的Linux。
如果对您使用情形来说,Linux是至关重要的,而且您需要跨不同操作系统的一致行为,那么只需使用不同的方法,例如网络文件系统(NFS)或跨平台一致支持Linux的分布式文件系统。

相关问题