如何在 Docker 容器中使用 setfacl?

Posted

技术标签:

【中文标题】如何在 Docker 容器中使用 setfacl?【英文标题】:How to use setfacl within a Docker container? 【发布时间】:2014-05-08 00:52:01 【问题描述】:

似乎在容器内挂载的文件系统没有“acl”,因此“setfacl”不起作用。而且它也不会让我重新安装它,我什至不能运行'df -h'。

我需要 setfacl 因为我让 root 拥有我网站上的所有文件,并且我只授予网络服务器用户对缓存、日志等少数目录的写入权限。

我能做什么?

【问题讨论】:

【参考方案1】:

好消息是 Docker 支持 ACL。

在早期版本中,Docker 使用了一个不支持它们的名为 AUFS 的文件系统。 您可以通过使用适当的选项启动 Docker 守护程序来告诉 Docker 使用 Device Mapper (LVM) 进行存储:

docker -d --storage-driver=devicemapper --daemon=true

来源:https://groups.google.com/forum/#!topic/docker-user/165AARba2Bk

然后你就可以在你的容器中使用setfacl

任何最近的版本或 Docker 现在都使用 overlay2 存储驱动程序,它支持开箱即用。 要检查您的存储驱动程序是什么:

docker info | grep Storage

df -h 因不同且不相关的原因不起作用:它依赖于 /etc/mtab,在您的情况下不存在。在您的容器中,从procfs 创建一个链接,这将解决此问题:

ln -s /proc/mounts /etc/mtab

【讨论】:

有趣!但是切换到 LVM 没有任何缺点吗?每次我读到 Docker 的好处时,都会提到 AUFS,尽管我并不完全理解它。无论如何,在您链接的源代码中,它说明了我正在考虑并接下来要尝试的事情:使用一个卷,无论如何我都需要在同一个地方共享文件。我只是不确定这将如何工作,因为当我运行这些命令时,我在 Dockerfile 中,所以我还没有我的卷,因为我在构建映像后启动 cointainer 守护程序时添加了它们。 AUFS 和 LVM (dm-thin) 是非常不同的实现,这是一个很大的话题。但是在将 Docker 守护进程切换到它之后,您不应该看到任何功能差异。缺点:不太稳定,但他们声称这在 0.9 和 0.9.1 版本中得到了很大改善。另外,请注意卷也接受绑定挂载:您可以将主机上的现有目录绑定到容器,我想这将允许您在映像构建时“看到”相同的内容。 来自文档:“请注意,由于 Dockerfile 的可移植性和共享目的,[bind mount] 不可用”。更改存储驱动程序似乎不错,我发现可以在 /etc/default/docker 中轻松修改选项。但是我需要重建所有的图像,所以当我这样做的时候我意识到了一些事情:我正在使用容器!这意味着我不需要像以前那样担心权限,所以现在我只需 chown/chmod 我希望网络服务器用户可写的文件夹,不需要使用 setfacl。感谢您的帮助! 你知道Overlay2是否支持ACL吗? 这篇博文tech.kaleo.blog/post/use-setfacl-within-docker 说overlay2 支持虽然我无法在alpine 上使用overlay2 设置acl。

以上是关于如何在 Docker 容器中使用 setfacl?的主要内容,如果未能解决你的问题,请参考以下文章

如何将运行在 Docker 容器中的 Flyway 连接到运行在 Docker 容器中的数据库?

如何在docker centos容器中使用systemd

(Docker)如何在 WordPress 容器中使用单独的 Composer 容器安装依赖项?

如何使用 VS Code 在 Docker 容器中远程调试 python 代码

如何使用 docker-compose 在 docker 容器中为 Laravel 环境安装 Behat?

如何解决docker宿主机无法访问容器中的服务