Docker 尝试以非根用户身份从容器内部写入装入的卷时出现问题

Docker 尝试以非根用户身份从容器内部写入装入的卷时出现问题,docker,permissions,ubuntu-14.04,apache-zookeeper,Docker,Permissions,Ubuntu 14.04,Apache Zookeeper,我正在使用一个将运行ZooKeeper的容器,但是我在装载到容器中的主机卷上遇到了权限问题 这是我的设置: 在主机上(Ubuntu 14.04): 创建了一个“zookeeper”系统用户(id=106)和组(id=111) 创建目录“/var/log/zookeeper”,并将其所有权设置为zookeeper(即chown zookeeper:zookeeper)。这是我将装入容器的目录 容器内部(Ubuntu 14.04): 还创建了一个“zookeeper”系统用户(id=102)和

我正在使用一个将运行ZooKeeper的容器,但是我在装载到容器中的主机卷上遇到了权限问题

这是我的设置:

在主机上(Ubuntu 14.04):

  • 创建了一个“zookeeper”系统用户(id=106)和组(id=111)
  • 创建目录“/var/log/zookeeper”,并将其所有权设置为zookeeper(即chown zookeeper:zookeeper)。这是我将装入容器的目录
容器内部(Ubuntu 14.04):

  • 还创建了一个“zookeeper”系统用户(id=102)和组(id=105),我将其用作在入口点执行命令的用户
  • 创建同一个目录“/var/log/zookeeper”,该目录将被装载到,并将其所有权设置为zookeeper:zookeeper(尽管我认为这并不重要)
一旦我用/var/log/zookeeper挂载启动容器,并以zookeeper用户的身份打开容器内部的一个外壳(该外壳是在容器内部创建的),如果我尝试在挂载的目录/var/log/zookeeper中创建一个文件,就会发现“权限被拒绝”错误。当我使用“ls-l”查看此目录的所有权(仍在容器中)时,它看起来如下所示:

drwxr-xr-x 2  106  111   4096 Jun 30 17:18 zookeeper
本例中的106和111对应于主机的zookeeper用户和组ID,我认为这就是问题所在。我尝试在容器内部打开一个shell,但这次我作为root用户进入,我上面描述的场景运行得非常好,只是root是创建的文件的所有者(这是预期的)

由此我得出结论,我需要:

(a)在我的容器中以默认根用户而不是我创建的zookeeper用户的身份运行应用程序

(b)在我的主机上和容器内创建一个zookeeper用户和组,其id完全相同

这两种情况都不理想,因为对于(a),以root用户身份运行应用程序可能会有潜在的安全问题(从我所读的内容来看),而对于(b),由于创建的其他用户可能已经使用了id,因此很难获得匹配的id(这是你无法控制的)


以前有人处理过类似的问题吗?我可能忽略了其他可能的解决方案吗?

据我所知,容器内和主机上的用户ID和组ID应该匹配,以便让主机授予您对共享目录的权限。

了解其中的差异非常重要在运行生产容器和开发容器之间。 顺便说一句,如果Docker容器以root用户身份运行,即使是在生产环境中,也没有什么真正的问题。但是,您永远不应该希望或需要装载生产量。如果您想以zookeeper身份运行它,请随意这样做

//编辑:我读得越多,我就越确信在以root身份运行东西时实际上可能存在安全问题,所以最好不要在生产环境中这样做

尝试匹配uid和gid的解决方案只适用于小型/本地项目-它确实使其不可移植。您可以尝试设置任意高的uid和gid,然后在每个开发人员的机器上执行相同的操作,但这并不意味着它总是好的


tl;dr:Ondevelopment在现有文件上运行
chmod-R 0777
,然后
umask 0000
设置对以后创建的文件和目录的权限。然后,您可以随意装载和编辑您的文件,无论是由哪个用户创建的。

请在您之后运行
ls-l/var/log/zookeeper
好吗
docker run
您的容器。我想知道您装入的卷的组所有者是否是
staff
(就像在使用boot2docker的
Windows/OS X
环境中一样)@Oliboy50在容器内部,看起来是这样的(与我最初发布的内容相同):
drwxr-xr-x 2 106 111 4096 Jun 30 17:18 zookeeper
从主机本身看,它是这样的:
drwxr-xr-x 2 zookeeper 4096 Jul 1 23:52 zookeeper
请注意,我正在Ubuntu上运行,所以我想我不会看到“工作人员”来自Windows的组。嘿,谢谢你的回答。你知道在“便携式”中分配ID的简单方法吗(即确保不会有冲突)方法?你有没有找到一种简单的方法来自动设置新容器,从而减少id冲突的可能性?@massivedynamic好问题…没有,我没有自动设置,但我相信这并不难。找到了这个。希望有帮助