在主机上,我有用户'appuser',在我的dockerfile中,我创建了用户'appuser'。
1)假设我的程序从/ tmp / a /接收一个文件,然后向/ tmp / b /输出一个新文件,该文件作为卷从主机传递到容器。 2)作为主机上的appuser,我创建了/tmp/a/test.txt,但是由于某种原因,输出的文件具有“ polkitd:libstoragemgmt”权限,而不是“ appuser:appuser”。
如何确保输出的文件具有“ appuser”权限(相同的用户在容器中运行程序)?
答案 0 :(得分:0)
容器内的用户在主机上不存在,两个环境之间共享的是UID / GID。因此,在容器内,该UID可能会映射到appuser,而在您的主机上该UID可能会映射到polkitd。如果查看主机和容器上的/ etc / passwd文件,您会发现它们可能不匹配。只有在使用主机挂载时,这才真正可见,因为在这种情况下,文件所有者在主机上可见。
您可以尝试的一种解决方案是将/ etc / passwd和/ etc / group从主机安装到容器,以便在每一侧具有相同的用户和组,但是这样做的缺点是可以构建映像主机上不存在的用户,或者如果主机上存在用户,则该用户可能具有不同的UID / GID值,从而使文件系统上的文件归错误用户所有。
我的个人解决方案是使用我在入口点内运行的脚本来调整容器内的UID / GID以匹配主机上的用户。它将您作为卷装入的文件或目录的所有者与容器内用户的所有者进行比较,如果不匹配,则修改容器用户。您需要以root用户身份启动容器,但是您可以在入口点的末尾从root用户降到appuser来运行container命令(为此,我通常使用exec + gosu)。您可以在https://github.com/sudo-bmitch/docker-base的基本映像存储库中找到用于此脚本的脚本,修复程序以及示例。