在Dockerfile中使用useradd

8

RUN useradd ... 命令在Dockerfile中会发生什么? 该用户在哪里创建?它住在哪里?它是否被添加到内核管理的UID池中? 当构建上下文容器退出时,它会发生什么?

1个回答

11
在Linux中,“用户”是一个数字用户ID,加上对/etc/passwd(可选)中的某些特定用户名和其他属性的映射。不存在“uid池”;如果我现在恰好有用户ID 12345,则文件系统所有权检查等会进行数字比较,这就是结束了。
因此,如果Dockerfile执行RUN useradd,它将运行useradd命令,该命令(除其他外)向镜像的文件系统空间中的/etc/passwd添加条目。Docker知道在镜像的/etc/passwd文件中查找Dockerfile USER指令或docker run -u选项。 (但您也可以在那里使用数字UID。)
根据主机操作系统和Docker守护程序配置的不同,如果使用docker run -v选项将主机目录映射到容器中,则容器进程必须以root或与目录所有者相同的数字用户ID运行才能访问其文件。相关主机和容器用户的名称并不重要。
通常最佳实践是以root身份执行所有安装操作,然后创建一个非root用户(其用户ID并不重要,只要不是0),并将其作为在执行容器时的默认用户。
FROM ubuntu

# Defaults to root; root will own all installed files
RUN ... && make install

# Set up a non-root user
RUN useradd myapp
USER myapp

# Say how to run the container (as user "myapp")
CMD ["myapp"]

似乎这个问题应该移动到Linux和Unix问答网站。我该如何将它移动到那里并保留您的答案? - A. Sallai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接