具有不同用户的单个容器定义

时间:2018-07-17 19:04:01

标签: docker

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

如果只有一个USER,我将执行以下操作:

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

然后运行的进程将由usera拥有,一切都会很好。

但是,如果可以构建一个容器,那将是很好的选择,但是在容器启动时,必须通过一些参数来设置用户。

我怀疑可以通过在Dockerfile中添加ENTRYPOINT,然后通过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,那就这样吧。

1 个答案:

答案 0 :(得分:2)

您有两个选择:

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

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

第二种方法的问题在于,您必须事先准备文件系统权限,因为一旦启动该过程便无法chown / chmod。