我正在使用 Docker 创建可以作为容器运行的映像。我以 root 用户身份配置我的映像,包括设置卷和其他内容。但是,一旦我完成所有配置,我想将权限授予非特权用户来运行我的实际应用程序。以下是我目前正在尝试做的事情:
# Do privileged stuff
su myuser -c "myapplicationcommand $@"
然而,当这些容器部署时,我显然在非交互式 shell 中运行,因为我收到此错误:
su: must be run from a terminal
因此,显然“su”命令需要在交互式 shell 中运行。所以我的问题是:如何从非交互式 shell 中删除权限,以便我的应用程序可以在 Docker 容器内以非 root 用户身份运行?
答案1
这是一个老问题,但我没有看到很多好的答案,因此添加此更新,希望它能够帮助其他人:
您可以使用 docker run -t 和 docker exec -it 选项在 docker exec 会话中分配 pty。这里有一个很好的问题和答案: https://github.com/docker/docker/issues/8631
这更简单:而且您不必改变创建或运行容器的方式。使用 docker exec,您只需使用 -u 选项即可以不同用户身份登录容器,避免使用 su。例如
$ docker exec -u root -it small_hypatia bash
$ docker exec -u someone-else -it small_hypatia bash
另请参阅此处有关解决“su:必须从终端运行”的更通用答案。特别是,了解如何使用“ssh -t”和“ssh -tt”很有用。对于遇到相同问题的人,python pty allocate cute hack 也可用于让 su 工作。 https://stackoverflow.com/questions/36944634/su-command-in-docker-returns-must-be-run-from-terminal/41872292#41872292
答案2
通常,su 不会依赖 tty。但是,如果使用 su 时遇到问题,也许您可以改用 sudo 来做同样的事情。
答案3
您可以使用
RUN adduser myuser
USER myuser
RUN foo
CMD bar
foo(在构建期间)和 bar(在运行时)都将以 myuser 身份运行。