我们在 RHEL 主机上使用 Red Hat 容器镜像,全部基于它们的 ubi7 或 ubi8 镜像,默认情况下,它们以默认用户 (uid 1001) 运行。
这在容器需要对主机目录进行写访问(即写入日志或临时文件)时提出了挑战,因为主机的 UID 和 GID 保存在容器中,而容器写入的文件将归该 UID 所有容器用户。
据我所知,这给我留下了两个选择:
- 在我的主机上创建一个 UID 为 1001 的用户,并将该用户设置为已安装卷的所有者。这可能会带来问题,因为 UID 1001 是在不强制使用特定 UID 的主机上添加新用户时将使用的第一个 UID。因此,如果需要将容器部署在可能具有或不具有相同一致 UID 映射的多台服务器上,则可能很难管理。然而,据我所知,这将是唯一的方法,容器写入的文件的所有者(UID 1001)与主机上的所需用户匹配,并且主机上写入的文件的所有者与现有的 UID 匹配容器。
- 将挂载的主机目录设为全局可写,这会带来许多安全隐患,其中之一是主机上的任何用户都有权删除容器写入的文件。如果 UID 1001 已分配给主机上的另一个用户,这些文件也可能显示为由另一个用户拥有。
通常,我会在容器镜像中创建一个匹配的 user:group 组合,在需要的地方重置所有权和权限并重建它,但是对于 Red Hat 创建的镜像,这意味着很多工作要做,因为一切都是为了使用 UID 1001 运行,并且有许多脚本(容器入口点修复权限、生成容器用户)以这种方式强制它。
我是否正确理解了所有内容,还是有另一种(更好的)方法可以做到这一点?
我只是想通了... Red Hat 映像会自动将默认用户的 uid 更改为您使用 generate-container-user 脚本运行容器的任何内容,因此我只需要使用 USER 完成我的 Dockerfile 或运行它与 --user 一起工作。
另一种选择是使用 ACL。ACL 可以比用户/组/其他标准 *nix 权限灵活得多。
当然,ACL 的灵活性也使它们变得更加复杂。您可以使用类似下面的示例来设置 ACL。
花一些时间阅读 acl、setfacl、getfacl 的手册页并进行一些测试以确保您获得正确的权限。ACL 很复杂,下面只是一个示例。
例子
set_acl 脚本
acl_directories
acl_files