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

pcd*_*gio 5 docker dockerfile

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

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

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

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

我怎样才能完成我需要的事情?

BMi*_*tch 5

您以 root 身份启动容器。这将以 root 身份运行您的入口点。执行您需要的所有步骤,然后使最后一步如下所示:

exec gosu username /bin/bash
Run Code Online (Sandbox Code Playgroud)

/bin/bash以用户身份启动username您可以在此 github 存储库中找到 gosu 。它的优点是使用su隐式 exec 运行命令,从而避免离开可能破坏信号处理的父进程。

如果您设置/bin/bashCMD 的值,则可以通过以下方式使其更加灵活:

exec gosu username "$@"
Run Code Online (Sandbox Code Playgroud)

确保对 ENTRYPOINT 和 CMD 使用 json 语法,以避免合并命令和 cli 参数出现问题。

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