在ubuntu之上创建了一个应用程序映像。应用程序需要一个非根用户。
我能够创建映像并使其工作,但是用于创建新用户的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获取最终构建中的相关文件。不知道这些文件会是什么。
发布于 2021-01-10 12:38:07
不要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 ...https://stackoverflow.com/questions/65650512
复制相似问题