ENTRYPOINT:首先以root用户身份运行命令,然后为非root用户启动shell

时间:2019-05-22 21:41:17

标签: docker dockerfile

我正在为映像编写一个Dockerfile,该映像在运行时按顺序执行以下两项操作:

  1. 以root身份启动守护程序
  2. 以非root用户身份启动交互式shell

问题在于ENTRYPOINT只能以单个用户身份运行(无论哪个USER设置在Dockerfile中ENTRYPOINT之前的最后一个)。在这种情况下,ENTRYPOINT只能以root用户或非root用户身份运行。

我不能将CMD命令放在ENTRYPOINT之前,因为它们只是被ENTRYPOINT覆盖。

我该如何完成我所需要的?

1 个答案:

答案 0 :(得分:0)

您以根用户身份启动容器。这将以root身份运行您的入口点。执行所需的所有步骤,然后使最后一步看起来像这样:

exec gosu username /bin/bash

以用户/bin/bash的身份启动username。您可以找到gosu in this github repo。它的优点是可以运行带有隐式exec的su命令,这样可以避免离开父进程,而这会破坏信号处理。

如果将/bin/bash设置为CMD,则可以通过以下方法使此方法更加灵活:

exec gosu username "$@"

请确保对ENTRYPOINT和CMD使用json语法,以避免合并的命令和cli args问题。

这比sudo更可取,因为它避免了任何从用户返回到root的选项。