目前我面临以下挑战: 我正在扩展一个基本图像,它在末尾设置了一个
USER
“安全用户”。在我的依赖映像中,我尝试对基本映像的文件系统进行一些更改,但由于“safeuser”无法修改“root”中的文件,我需要通过USER ROOT
进行更改,进行更改,然后返回 USER SAFEUSER
。
这种方法看起来确实很丑陋,例如,如果基础图像将用户名从“safuser”更改为“othername”怎么办?有什么方法可以仅在构建过程中更改
USER
,或作为不同用户更改 RUN
单个命令,而无需显式切换回原始用户?或者我至少可以在构建过程中以某种方式存储一些对原始USER
的引用吗?
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 中,这并不理想。在选择这个之前,我会考虑其他(不太优雅但更安全)的选择。
或者我至少可以在存储过程中存储一些对原始用户的引用吗? 以某种方式构建过程?
是的,使用父映像中的
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 等)干净得多。避免安装或使用 sudo,因为它具有不可预测的 TTY 和 可能导致问题的信号转发行为。如果你绝对 需要类似于 sudo 的功能,例如将守护进程初始化为 root 但以非 root 身份运行,请考虑使用“gosu”。