如何在Docker容器中开发时pipe理权限?

在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等)同步。 本质上,将所有对数据的读写操作都移动到容器中,包括任何备份,更新例程和测试脚本。