【问题标题】:Using useradd in a Dockerfile在 Dockerfile 中使用 useradd
【发布时间】:2019-08-30 17:50:48
【问题描述】:

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

【问题讨论】:

  • 为什么投反对票?
  • 你好@A.Sallai 你的问题被否决了,因为你的问题目前包含多个问题。它应该只关注一个问题。

标签: linux docker uid


【解决方案1】:

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"]

【讨论】:

  • 看来问题应该移到 linux & unix Q&A 站点。我怎样才能把它移到那里并保留你的答案?
猜你喜欢
  • 2021-08-19
  • 2010-11-04
  • 2019-11-26
  • 2020-03-27
  • 2021-12-15
  • 2018-08-19
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
相关资源
最近更新 更多