在 Dockerfile 中找到RUN useradd ...
命令时会发生什么? 该用户在哪里创建?它住在哪里?它是否添加到内核管理的 UID 池中? 当生成上下文容器退出时会发生什么情况?
Linux 中的"user"是一个数字用户 ID,加上到某些特定用户名和/etc/passwd
中其他属性的映射(可选(。 没有"uid 池"这样的东西;如果我现在碰巧有用户 ID 12345,那么文件系统所有权检查之类的事情会进行数字比较,这就是它的结束。
因此,如果 Dockerfile 执行RUN useradd
,它会运行useradd
命令,该命令(除其他外(在映像的文件系统空间内添加一个条目/etc/passwd
。 Docker 知道在映像的/etc/passwd
文件中查找 DockerfileUSER
指令或docker run -u
选项。 (但您也可以在此处使用数字 uid。
根据主机操作系统和 Docker 守护程序配置,如果使用docker run -v
选项将主机目录映射到容器中,则容器进程必须以 root 身份运行,或者使用与目录所有者相同的数字用户 ID 才能访问其文件。 相应主机和容器用户的名称无关紧要。
我见过的通常的最佳实践是以 root 身份完成所有安装,然后创建一个非 root 用户(只要它不是 0,它的用户 ID 就无关紧要(,并在执行容器时使其成为默认用户。
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"]