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



在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拥有它。你也不需要设置外壳、密码或创建主目录;这些东西都不会在正常操作中使用。

我建议在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 ...

最新更新