【问题标题】:ENTRYPOINT: first run command as root, then start shell for non-root userENTRYPOINT:首先以 root 身份运行命令,然后为非 root 用户启动 shell
【发布时间】:2019-10-09 10:45:27
【问题描述】:

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

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

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

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

我怎样才能完成我所需要的?

【问题讨论】:

  • 仅供参考:我有一个可行但肮脏的解决方法。我将非 root 用户放在 sudoers 中,没有密码,所以我的入口点脚本现在可以使用 sudo 来启动守护进程,而无需提供密码。

标签: docker dockerfile


【解决方案1】:

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

exec gosu username /bin/bash

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

如果您将 /bin/bash 设为 CMD 的值,您可以通过以下方式使其更加灵活:

exec gosu username "$@"

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

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

【讨论】:

    猜你喜欢
    • 2021-10-11
    • 2015-07-07
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 2017-06-22
    • 1970-01-01
    相关资源
    最近更新 更多