Dockerfile - 创建非 root 用户几乎使图像大小增加了一倍

标签 docker dockerfile

在 ubuntu 上创建了应用程序镜像。该应用程序需要非 root 用户。

我能够创建图像并使其正常工作,但用于创建新用户的 RUN 语句会显着增加该图像的大小。

Dockerfile 片段:

  ## create newuser and give correct permissions to home directory
  RUN useradd newuser --create-home --shell /bin/bash  && \
      echo 'newuser:newpassword' | chpasswd && \
      chown -R newuser:newuser /home/newuser && \
      chmod 755 /home/newuser

  USER newuser

  WORKDIR /home/newuser

有更好的方法来创建新用户吗?

考虑替代方法,想知道是否使用多阶段构建来创建这个新用户,然后使用 copy --from 在最终构建中获取相关文件。不确定这些文件是什么。

最佳答案

不要chown目录;让 root 拥有它。您也不应该需要设置 shell、密码或创建主目录;这些东西在正常操作中都不会被使用。

我建议在 Dockerfile 的开头创建用户(它是相当固定的,因此可以缓存此步骤),但仅在文件的末尾切换 USER ,当您正在设置有关如何运行容器的元数据。

基于节点的示例:

FROM node:lts # debian-based

# Create the non-root user up front
RUN adduser --system --group --no-create-home newuser

# Copy and build the package as usual
WORKDIR /app
COPY package.json yarn.lock .
RUN yarn install
COPY . .
RUN yarn build

# Now the application is built
# And root owns all the files
# And that's fine

# Say how to run the container
EXPOSE 3000
USER newuser
CMD yarn start

root 拥有这些文件可以为您提供一点额外的保护,以防出现问题。如果存在允许覆盖容器中的文件的错误,则让其他用户拥有这些文件可以防止应用程序代码或静态 Assets 被无意中修改。

如果您的应用程序需要读取或写入文件,那么您可以为此创建一个特定目录:

 # Towards the end of the file, but before the USER
 RUN mkdir data && chown newuser data

这将让运算符(operator)在原本为空的目录上挂载一些存储。这是唯一一个包含新创建的用户 ID 的东西,因此如果存储有自己的所有者,那么它不应该是一个操作问题;您还需要在容器启动时指定匹配的用户 ID。

docker run -u $(id -u) -v $PWD/data:/app/data ...

关于Dockerfile - 创建非 root 用户几乎使图像大小增加了一倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65650512/

相关文章:

postgresql - Docker PostgreSQL 暴露密码?

linux - 如何只显示 Docker 容器中分配的资源?

docker redis 备份

docker - 使用 SSL 的 Nginx 子域重定向不起作用

python - 在dockerfile中安装mysql?

docker - docker build 会运行两次命令吗?

docker - docker 是否可以并行构建多阶段镜像?

配置文件的 docker secret

java - Java应用程序如何知道它正在Docker容器中运行

docker - 在Raspberry pi/dev/spi *上的Dockerfile中执行chmod