在 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/