在Linux上的Docker容器中开发时,存在权限问题:如何pipe理主机和容器之间的文件所有权和权限。
想象一下,我有一个运行Ubuntu和Apache服务器的Docker镜像。 使用(最新版本的)Apache的默认设置,文档根目录将是/var/www/html
,Apache将作为www-data
用户运行。
为了做一些开发,我通过Docker使用-v /path/to/my/files:/var/www/html
公开了文档根目录。 这就是问题出现的地方:
/path/to/my/files
由容器www-data
用户拥有。 如果我很幸运,我的主机有一个www-data
用户,这将是该用户; 否则,它将是容器本地的不同用户。 这些文件的权限(可能)是0755
。
所以,当我以我自己的身份(一个叫jsmith
的用户)离开时,由于文件权限和所有权不正确,我不能编辑这些文件。
我可以将文件的所有权更改为jsmith
,但这会导致Apache出现问题 – 访问文档根目录中的文件时遇到困难。
我可以将权限更改为0777
,但是我在工作过程中创build的任何新文件都将由jsmith
拥有。
最终的结果是有必要不断调整开发文件的所有权和权限。 其他人一定会遇到这个问题,但是在开发工作stream中使用Docker这个话题的每篇文章都只是忽略了这个问题。
我有一个解决scheme,但我并不完全满意:
我在/src/myproject
设置了一个文件夹。 这包含我的开发文件,并由www-data:www-data
。
使用BindFS ,我在~/myproject
挂载/src/myproject
,将www-data:www-data
映射到jsmith:jsmith
。 这使我可以在~/myproject
编辑文件,而不会混淆权限。
Apache Docker容器使用-v /src/myproject:/var/www/html
挂载/src/myproject
目录。 Apache看到这些文件的www-data
所有权,并没有问题。
这工作得很好,但似乎过于复杂。 别人怎么解决这个问题呢?
我可以想到两个解决方案:
在所有开发人员和图像中使用一个通用的组ID。 uid最终可能是容器中的数字,但gid至少会读取访问权限,并且可以选择写入访问权限,而不会在全局范围内提供。 使用包含目录中的setgid位来使用此gid自动创建文件。 这不是最干净的方法,可能会导致访问其他组成员,但根据组织的工作流程可能更容易管理。
第二个选项是命名的卷,我相信你问这个问题后添加。 他们让你的数据存在与容器已知的uid / gid。 这有一个缺点,就是将数据移到内部的docker目录,在这个目录中,在容器外部管理起来不那么容易。 但是,有一些微服务方法可以使用专门的容器挂载相同的卷,从而保持卷与外部源(git pull,rsync等)同步。 本质上,将所有对数据的读写操作都移动到容器中,包括任何备份,更新例程和测试脚本。