【问题标题】:Permissions on Volume files created by DockerDocker 创建的 Volume 文件的权限
【发布时间】:2019-10-22 00:06:04
【问题描述】:

我正在运行一个容器,它将创建/修改一些我需要在容器生命周期之外保留的文件。因此,我为此目的在容器中添加了一个文件夹:

docker run -v $(pwd)/data:/app/data my-image

在第一次运行时,$(pwd)/data 不存在,所以 Docker 会为我创建它。但是,它会在用户执行其自己的守护进程时创建它,即root。这是有问题的,因为容器内的用户显然不是root

为了解决这个权限问题,我在主机中创建了一个用户组,与容器中的用户具有相同的 ID,并授予他们访问 $(pwd)/data 的父文件夹的权限,并添加了组权限设置文件夹 (chmod g+s)。因此,如果我以 root 身份运行以下命令:

sudo mkdir whatver

文件夹whatever 将可由该组和扩展名由容器的用户修改。但是当 Docker 创建文件夹 $(pwd)/data 时,它仍然被创建为属于组 root,并且容器内的用户再次无法修改其中的数据。

现在,我通过在运行容器之前创建所需的文件夹来解决这个问题。然而,这是一个肮脏的解决方法,我正在寻找一个更清洁的解决方案。有没有其他人遇到过这个问题?这是 Docker 不尊重父文件夹上的组权限设置的问题,还是我在这里遗漏了什么/做错了什么?

【问题讨论】:

    标签: docker permissions docker-volume


    【解决方案1】:

    我不认为首先制作文件夹是一种肮脏的解决方法,这对我来说是最佳做法。 Docker 正在为您运行绑定挂载,当源目录不存在时这将失败。为了方便用户,当你挂载主机并且目录丢失时,docker会为你创建这个目录,但是你不需要使用这个功能,你会发现其他类型的挂载不会为你执行目录创建(例如swarm 模式常用的--mount 语法)。

    您可以以 root 身份启动容器并使用入口点修复目录的权限,然后在最后运行类似 exec gosu app_user app_server 的内容以从 root 删除到用户。我在 docker-base 图像的入口点执行此操作,这对于开发人员工作流程非常有用,开发人员经常需要动态更新容器以与他们的主机环境一起工作。

    否则,您可以切换到命名卷。这些将在它们是新的或为空时使用图像中的目录内容和权限进行初始化。当您需要持久性而不是直接文件系统从主机上的用户访问卷的内容时,它们是最佳实践。您将改为从挂载该卷的容器内部访问命名卷。

    【讨论】:

    • 谢谢。关于您提出的各种观点:#1 我认为这是一种肮脏的解决方法,因为负责启动容器的代码需要能够与底层文件系统进行通信,同时与 docker 通信。基本上,更多的认识,更多的耦合,更多的未来麻烦。 #2 我确实希望 docker 创建丢失的文件/文件夹,但使用与 shell 相同的权限设置。所以我不知道mount 是否是一个不错的选择。 #3 命名卷听起来很诱人。会给他们一个尝试,并在此回复您,感谢您的想法。
    猜你喜欢
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 2020-09-02
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    相关资源
    最近更新 更多