【问题标题】:How do you manage permissions when developing in a Docker container?在 Docker 容器中开发时如何管理权限?
【发布时间】:2015-12-21 07:02:09
【问题描述】:

在Linux上使用Docker容器进行开发时,存在权限问题:如何管理主机和容器之间的文件所有权和权限。

假设我有一个运行 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,但我在工作过程中创建的任何新文件都将归jsmith所有。

最终结果是需要不断调整开发文件的所有权和权限。其他人肯定有这个问题,但我看到的每一篇关于在开发工作流程中使用 Docker 的帖子都忽略了这个问题。

确实有一个解决方案,但我并不完全满意:

  • 我在/src/myproject 设置了一个文件夹。这包含我的开发文件,归 www-data:www-data 所有。

  • 使用BindFS,我将/src/myproject 挂载到~/myproject,将www-data:www-data 映射到jsmith:jsmith。这让我可以在~/myproject 中编辑文件,而不会乱用权限。

  • Apache Docker 容器使用-v /src/myproject:/var/www/html 挂载/src/myproject 目录。 Apache 看到文件的 www-data 所有权,没有问题。

这很好用,但似乎过于复杂。其他人如何解决这个问题?

【问题讨论】:

  • 您有没有找到其他解决权限问题的方法?
  • 对不起,我没有任何建议。我来这里是为了寻找相同的答案 - 您的 BindFS 提示对我很有帮助。
  • 也许 [lebokus/docker-volume-bindfs ](github.com/lebokus/docker-volume-bindfs) 对你有用。

标签: linux permissions docker


【解决方案1】:

我意识到我很可能为时已晚,但这可能对某人有所帮助。

在您的 Dockerfile 中,您可以这样做:

RUN usermod -u 1000 www-data
RUN groupmod -g 1000 www-data

这可能适用于某些设置。

【讨论】:

    【解决方案2】:

    我能想到两种解决方案:

    在所有开发者和图像中使用一个共同的组 ID。 uid 可能最终在容器中是数字,但 gid 至少会提供读取访问权限,并且可以选择写入访问权限,而不会全局提供。使用包含目录上的 setgid 位来使用此 gid 自动创建文件。这不是最干净的方法,并且可能会导致向其他组成员授予访问权限,但根据您组织的工作流程,它可能更容易管理。

    第二个选项是命名卷,我相信它是在您提出这个问题后添加的。它们让您拥有容器已知的 uid/gid 的数据。这样做的缺点是将数据移动到内部 docker 目录中,在容器外部不太容易管理。但是,有一些微服务方法可以使用挂载相同卷的专用容器使卷与外部源(git pull、rsync 等)保持同步。您基本上将所有数据的读取和写入移动到容器中,包括任何备份、更新例程和测试脚本。


    更新:我经常用于开发环境的第三个选项是以 root 身份运行入口点脚本,该脚本将已安装的卷 uid/gid 与容器内用户的 uid/gid 进行比较。如果它们不匹配,则更新容器内用户的 uid/gid 以匹配主机。这允许开发人员在多个主机上重用相同的图像,其中每个开发人员的 uid/gid 在他们的位置机器上可能不同。执行此操作的代码包含在我的 bin/fix-perms 脚本中,该脚本是我的示例 base image 的一部分。我的入口点脚本的最后一步是使用 gosu 从 root 回到用户,现在使用更改的 uid/gid,所有写入的文件现在都将匹配主机上用户的文件。

    如果您碰巧在 MacOS 上运行,最近一项名为 osxfs 的功能会自动纠正与主机卷不匹配的 uid/gid。

    【讨论】:

      猜你喜欢
      • 2019-09-13
      • 2014-11-07
      • 1970-01-01
      • 2020-04-01
      • 2019-05-10
      • 1970-01-01
      • 2019-11-04
      • 2020-01-17
      • 2012-07-11
      相关资源
      最近更新 更多