首页 > 解决方案 > Docker 创建的 Volume 文件的权限

问题描述

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

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 不尊重父文件夹上的组权限设置的问题,还是我在这里遗漏了什么/做错了什么?

标签: dockerpermissionsdocker-volume

解决方案


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

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

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


推荐阅读