【问题标题】:Single container definition with different users具有不同用户的单一容器定义
【发布时间】:2018-12-25 13:57:02
【问题描述】:

由于某些原因,我们有两个网络。在网络 A 上,应该在容器中执行进程的 USER 可能是 usera。在网络 B 上,用户可能是 userb。用户的 uid/gid 必须与 ldap 定义匹配,并且这些定义都很好。进程写入的持久性文件用于绑定 SAN 上的挂载目录(显然每个网络上的 SAN 不同),因此进程所有者很重要。

如果只有一个用户,我会执行以下操作:

FROM <base image>
RUN groupadd -g 999 usera && useradd -u 999 -g 999 usera
USER usera
CMD ["process", "'params"]

那么正在运行的进程将归usera所有,一切都会好起来的。

但是,如果可以构建单个容器会很好,但在容器启动时通过一些参数设置用户。

我怀疑可能通过将ENTRYPOINT 添加到 Dockerfile,然后可能通过 docker run -e USER=[usera|userb] 发送值来实现,但我刚刚开始使用 Docker,所以我不确定具体如何那会工作的。

我查看了processes in containers should not run as root,它给出了一些建议。此外,我们绝对不能让容器以 root 身份运行。我还查看了Docker Replicate UID/GID in container,它提供了关于可能通过-e 发送值的提示,但是关于构建系统和运行系统上的 id 不匹配的警告并不适用。

我怎样才能让这个不同的用户拥有一个进程,可能通过传入一个值(不过,如果我有一个足够复杂的脚本,我可以检测容器正在运行的网络,并且我可以设置一些变量自动)?

编辑:由于审核和审查要求,如果可以确保用户设置(或者如果未提供则无法启动),而不是使用例如--user 参数到docker run。尽管如此,如果唯一/最好的方法是--user,那就这样吧。

【问题讨论】:

  • 您可以在进程启动时检查有效uid,如果为零(root)则中止,以确保进程不会以root身份运行。

标签: docker


【解决方案1】:

你有两个选择:

  • 以 root 身份运行脚本(这将是入口点),将 UID/GID 作为环境变量传递,使用 usermod|groupmod 更改用户/组 ID,然后使用新用户执行实际进程。检查 gogs/gogs 镜像中可自定义 UID/GID 的容器的 example

  • 使用 docker run 命令上的--user 开关,以便进程以正确的 UID/GID 开始。您无需使用此选项在 Dockerfile 上创建用户,因为 UID 将被命令行中的用户覆盖。

第二种方法的问题是你必须事先准备好文件系统权限,因为一旦进程启动你就不能chown/chmod。

【讨论】:

    猜你喜欢
    • 2021-03-07
    • 2011-06-09
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    相关资源
    最近更新 更多