尝试以非 root 用户身份从容器内部写入已安装的卷时出现问题
Issue when trying to write to a mounted volume from inside a container as a non-root user
我正在使用一个将成为 运行 ZooKeeper 的容器,但我 运行 遇到了我挂载到容器中的主机卷的权限问题。
这是我的设置:
在主机上(Ubuntu 14.04):
- 创建了一个 "zookeeper" 系统用户 (id=106) 和组 (id=111)。
- 创建目录“/var/log/zookeeper”并将其所有权设置为 zookeeper(即 chown zookeeper:zookeeper)。这是我将安装到我的容器中的目录。
容器内(Ubuntu 14.04):
- 还创建了一个 "zookeeper" 系统用户 (id=102) 和组 (id=105),我将其用作在 ENTRYPOINT 中执行命令的用户。
- 创建将挂载到的相同目录“/var/log/zookeeper”,并将其所有权设置为 zookeeper:zookeeper(尽管我认为这无关紧要)。
一旦我使用 /var/log/zookeeper 挂载启动我的容器,并以 zookeeper 用户身份在容器内打开一个 shell(在容器内创建),我发现我如果我尝试在挂载目录 /var/log/zookeeper 中创建文件,则会出现 "Permission Denied" 错误。当我执行 "ls -l" 查看此目录(仍在容器内)的所有权时,它看起来像这样:
drwxr-xr-x 2 106 111 4096 Jun 30 17:18 zookeeper
本例中的 106 和 111 对应于主机的 zookeeper 用户和组 ID,我认为这是问题所在。我尝试在容器内打开一个 shell,但这次我以 root 用户身份进入,我上面描述的场景运行得非常好,只是 root 是所创建文件的所有者(这是预期的) .
由此我得出结论,我需要:
(a) 运行 我容器内的应用程序作为默认 root 用户而不是我创建的 zookeeper 用户。
(b) 在我的主机上和 ID 完全相同的容器内创建一个 zookeeper 用户和组。
这两种情况都不理想,因为对于 (a)、运行 作为 root 用户的应用程序可能存在潜在的安全问题(从我读过的内容来看) ,并且对于 (b),可能很难让 ID 匹配,因为它们可能已经被创建的其他用户使用(您没有有任何控制权)。
有没有人以前处理过这样的事情?还有其他可能的解决方案我可能会忽略吗?
据我所知,容器内和主机上的用户 ID 和组 ID 应该匹配,以便让主机授予您共享目录的权限。
了解运行生产和开发容器之间的区别非常重要。
Afaik,如果您的 Docker 容器 运行 是根用户,即使在生产环境中也没有真正的问题。但是,您永远不希望或不需要进行大量生产。如果你想 运行 它作为 zookeeper 随时这样做。
// 编辑:我读得越多,我就越相信当 运行 以 root 用户身份运行时实际上可能存在安全问题,所以你最好不要这样做制作.
尝试匹配 uid 和 gid 的解决方案仅适用于 small/local 项目 - 它确实成功了不可携带。您可以尝试设置任意高 uid 和 gid 然后在您的每台开发机器上执行相同的操作,但这并不意味着它总会好的。
tl;dr:在 开发中 运行 chmod -R 0777
在现有文件上 umask 0000
设置对以后创建的文件和目录的权限。然后你可以随心所欲地挂载和编辑你的文件,不管它是由什么用户创建的。
我正在使用一个将成为 运行 ZooKeeper 的容器,但我 运行 遇到了我挂载到容器中的主机卷的权限问题。
这是我的设置:
在主机上(Ubuntu 14.04):
- 创建了一个 "zookeeper" 系统用户 (id=106) 和组 (id=111)。
- 创建目录“/var/log/zookeeper”并将其所有权设置为 zookeeper(即 chown zookeeper:zookeeper)。这是我将安装到我的容器中的目录。
容器内(Ubuntu 14.04):
- 还创建了一个 "zookeeper" 系统用户 (id=102) 和组 (id=105),我将其用作在 ENTRYPOINT 中执行命令的用户。
- 创建将挂载到的相同目录“/var/log/zookeeper”,并将其所有权设置为 zookeeper:zookeeper(尽管我认为这无关紧要)。
一旦我使用 /var/log/zookeeper 挂载启动我的容器,并以 zookeeper 用户身份在容器内打开一个 shell(在容器内创建),我发现我如果我尝试在挂载目录 /var/log/zookeeper 中创建文件,则会出现 "Permission Denied" 错误。当我执行 "ls -l" 查看此目录(仍在容器内)的所有权时,它看起来像这样:
drwxr-xr-x 2 106 111 4096 Jun 30 17:18 zookeeper
本例中的 106 和 111 对应于主机的 zookeeper 用户和组 ID,我认为这是问题所在。我尝试在容器内打开一个 shell,但这次我以 root 用户身份进入,我上面描述的场景运行得非常好,只是 root 是所创建文件的所有者(这是预期的) .
由此我得出结论,我需要:
(a) 运行 我容器内的应用程序作为默认 root 用户而不是我创建的 zookeeper 用户。
(b) 在我的主机上和 ID 完全相同的容器内创建一个 zookeeper 用户和组。
这两种情况都不理想,因为对于 (a)、运行 作为 root 用户的应用程序可能存在潜在的安全问题(从我读过的内容来看) ,并且对于 (b),可能很难让 ID 匹配,因为它们可能已经被创建的其他用户使用(您没有有任何控制权)。
有没有人以前处理过这样的事情?还有其他可能的解决方案我可能会忽略吗?
据我所知,容器内和主机上的用户 ID 和组 ID 应该匹配,以便让主机授予您共享目录的权限。
了解运行生产和开发容器之间的区别非常重要。 Afaik,如果您的 Docker 容器 运行 是根用户,即使在生产环境中也没有真正的问题。但是,您永远不希望或不需要进行大量生产。如果你想 运行 它作为 zookeeper 随时这样做。
// 编辑:我读得越多,我就越相信当 运行 以 root 用户身份运行时实际上可能存在安全问题,所以你最好不要这样做制作.
尝试匹配 uid 和 gid 的解决方案仅适用于 small/local 项目 - 它确实成功了不可携带。您可以尝试设置任意高 uid 和 gid 然后在您的每台开发机器上执行相同的操作,但这并不意味着它总会好的。
tl;dr:在 开发中 运行 chmod -R 0777
在现有文件上 umask 0000
设置对以后创建的文件和目录的权限。然后你可以随心所欲地挂载和编辑你的文件,不管它是由什么用户创建的。