【发布时间】: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