【发布时间】:2019-08-30 17:50:48
【问题描述】:
当在 Dockerfile 中找到 RUN useradd ... 命令时会发生什么?
该用户是在哪里创建的?它在哪里生活?是否添加到内核管理的 UID 池中?
当构建上下文容器退出时会发生什么?
【问题讨论】:
-
为什么投反对票?
-
你好@A.Sallai 你的问题被否决了,因为你的问题目前包含多个问题。它应该只关注一个问题。
当在 Dockerfile 中找到 RUN useradd ... 命令时会发生什么?
该用户是在哪里创建的?它在哪里生活?是否添加到内核管理的 UID 池中?
当构建上下文容器退出时会发生什么?
【问题讨论】:
Linux 中的“用户”是一个数字用户 ID,加上到 /etc/passwd 中某些特定用户名和其他属性的映射(可选)。没有“uid 池”之类的东西;如果我现在恰好有用户 ID 12345,那么文件系统所有权检查之类的东西会进行数字比较,这就是它的结束。
因此,如果 Dockerfile 执行 RUN useradd,它会运行 useradd 命令,该命令(除其他外)会在映像的文件系统空间内向 /etc/passwd 添加一个条目。 Docker 知道在镜像的 /etc/passwd 文件中查找 Dockerfile USER 指令或 docker run -u 选项。 (但您也可以在那里使用数字 uid。)
根据主机操作系统和Docker daemon configuration,如果您使用docker run -v 选项将主机目录映射到容器中,则容器进程必须以root 或相同的numeric 用户身份运行作为目录所有者的 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"]
【讨论】: