在 Dockerfile 中切换单个 RUN 命令的用户

问题描述 投票:0回答:2

目前我面临以下挑战: 我正在扩展一个基本图像,它在末尾设置了一个

USER
“安全用户”。在我的依赖映像中,我尝试对基本映像的文件系统进行一些更改,但由于“safeuser”无法修改“root”中的文件,我需要通过
USER ROOT
进行更改,进行更改,然后返回
 USER SAFEUSER

这种方法看起来确实很丑陋,例如,如果基础图像将用户名从“safuser”更改为“othername”怎么办?有什么方法可以仅在构建过程中更改

USER
,或作为不同用户更改
RUN
单个命令,而无需显式切换回原始用户?或者我至少可以在构建过程中以某种方式存储一些对原始
USER
的引用吗?

docker dockerfile
2个回答
0
投票

这可以使用

sudo --user
来完成:

root@machine:/home/user# whoami
root
root@machine:/home/user# sudo --user=user whoami
user
root@machine:/home/user# whoami
root

当在

Dockerfile
中使用时,它将如下所示:

# ...

RUN sudo --user=user mkdir /tmp/dir
RUN touch /tmp/dir/root_file

编辑:正如 @CharlesDuffy 在下面所写的,这样做需要将

safeuser
添加到构建机器的 sudoers 中,这并不理想。在选择这个之前,我会考虑其他(不太优雅但更安全)的选择。


0
投票

或者我至少可以在存储过程中存储一些对原始用户的引用吗? 以某种方式构建过程?

是的,使用父映像中的

ENV
变量,如下所述:存储和恢复继承的 Dockerfile 用户设置

来自 Dockerfile 参考文档:

阶段继承使用 ENV 设置的任何环境变量 它的父阶段或任何祖先。有关多阶段的更多信息,请参阅此处 构建。

家长图片:

ENV unprivilegeduser=safeuser
RUN groupadd -r unprivileged && useradd --no-log-init -r -g unprivileged $unprivilegeduser
USER $unprivilegeduser

相关图片:

#Switch to root for a single RUN command
USER root 
RUN doRootStuff
USER $unprivilegeduser

它需要三行,而不是您想要的单个优雅的“RUNAS”命令,但它比其他替代方案(如

sudo
docker inspect
ContainerConfig.User 等)干净得多。
根据 Dockerfile 指南

避免安装或使用 sudo,因为它具有不可预测的 TTY 和 可能导致问题的信号转发行为。如果你绝对 需要类似于 sudo 的功能,例如将守护进程初始化为 root 但以非 root 身份运行,请考虑使用“gosu”。

© www.soinside.com 2019 - 2024. All rights reserved.