在 Dockerfile 中使用 useradd
Using useradd in a Dockerfile
在 Dockerfile 中找到 RUN useradd ...
命令时会发生什么?
该用户是在哪里创建的?它在哪里生活?是否添加到内核管理的UID池中?
当构建上下文容器退出时会发生什么?
Linux 中的 "user" 是一个数字用户 ID,加上到 /etc/passwd
中某些特定用户名和其他属性的映射(可选)。没有 "uid pool" 这样的东西;如果我现在碰巧有用户 ID 12345,那么文件系统所有权检查之类的东西会进行数字比较,这就是它的结束。
因此,如果 Docker 文件执行 RUN useradd
,它 运行 是 useradd
命令,它(除其他外)向 [=11 添加条目=] 在图像的文件系统中 space。 Docker 知道在图像的 /etc/passwd
文件中查找 Docker 文件 USER
指令或 docker run -u
选项。 (但您也可以在那里使用数字 uid。)
根据主机 OS 和 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"]
在 Dockerfile 中找到 RUN useradd ...
命令时会发生什么?
该用户是在哪里创建的?它在哪里生活?是否添加到内核管理的UID池中?
当构建上下文容器退出时会发生什么?
Linux 中的 "user" 是一个数字用户 ID,加上到 /etc/passwd
中某些特定用户名和其他属性的映射(可选)。没有 "uid pool" 这样的东西;如果我现在碰巧有用户 ID 12345,那么文件系统所有权检查之类的东西会进行数字比较,这就是它的结束。
因此,如果 Docker 文件执行 RUN useradd
,它 运行 是 useradd
命令,它(除其他外)向 [=11 添加条目=] 在图像的文件系统中 space。 Docker 知道在图像的 /etc/passwd
文件中查找 Docker 文件 USER
指令或 docker run -u
选项。 (但您也可以在那里使用数字 uid。)
根据主机 OS 和 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"]