如何管理以非 root 用户运行的容器的绑定挂载所有权和权限?

Yan*_*ard 3 linux mount docker

我们在 RHEL 主机上使用 Red Hat 容器映像,全部基于其 ubi7 或 ubi8 映像,默认情况下以默认用户 (uid 1001) 运行。

当容器需要对主机目录进行写访问(即写入日志或临时文件)时,这会带来挑战,因为容器中保存了主机的UID和GID,并且容器写入的文件将归UID所有容器用户的。

据我所知,这给我留下了两个选择:

  1. 在我的主机上创建一个 UID 1001 的用户,并将该用户设置为已安装卷的所有者。这可能会带来问题,因为 UID 1001 是在主机上添加新用户时将使用的第一个 UID,其中 UID 不强制为特定内容。因此,如果容器需要部署在多个服务器上,而这些服务器可能具有或不具有相同的一致 UID 映射,则管理可能会很困难。然而,据我所知,这是唯一的方法,容器写入的文件的所有者(UID 1001)与主机上所需的用户匹配,并且主机上写入的文件的所有者与现有的 UID 匹配。容器。
  2. 将挂载的主机目录设置为全局可写,这会带来许多安全隐患,其中之一是主机上的任何用户都有权删除容器写入的文件。如果 UID 1001 已分配给主机上的另一个用户,这些文件也可能显示为由另一个用户拥有。

通常,我只会在容器映像内创建一个匹配的用户:组组合,在需要时重置所有权和权限并重建它,但对于红帽创建的映像,这意味着大量的跑腿工作,因为一切都是如此使用 UID 1001 运行,并且有许多脚本(container-entrypoint fix-permissions、generate-container-user)强制以这种方式运行。

我是否正确理解了一切,或者是否有另一种(更好的)方法来做到这一点?

Yan*_*ard 5

我刚刚想通了...Red Hat 镜像会自动将默认用户的 uid 更改为您使用generate-container-user脚本运行容器的任何内容,因此我只需要使用 USER 完成我的 Dockerfile ,或者运行与 --user 一起使用就可以了。