Dockerfile - 创建非 root 用户几乎使图像大小翻倍

时间:2021-01-10 05:56:24

标签: 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 获取相关文件。不确定这些文件是什么。

1 个答案:

答案 0 :(得分:1)

不要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 拥有这些文件可以在出现问题时为您提供一点额外的保护。如果存在允许覆盖容器中文件的错误,让其他用户拥有这些文件可以防止应用程序代码或静态资产被无意修改。

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

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

这会让操作员在原本为空的目录上安装一些存储。这是唯一一个包含新创建的用户 ID 的东西,所以如果存储有自己的所有者,它应该不是操作问题;您还需要在容器启动时指定匹配的用户 ID。

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