Docker无法保留chown用户权限设置问题求助
问题分析与解决方案
根本原因
Ubuntu 22.04官方镜像默认将/home目录配置为tmpfs临时文件系统。Docker的每个RUN步骤都会启动全新的容器实例,此时/home会被重新挂载为新的tmpfs,前序步骤中对/home目录的修改(包括创建用户家目录、调整权限)无法被持久化到后续镜像层,导致后续RUN步骤里/home/docker的属主被重置为root。
解决方案
方案1:合并相关操作到同一RUN步骤
同一RUN步骤内的所有命令在同一个容器运行时执行,tmpfs不会重新挂载,所有修改会被完整保存到镜像层。修改后的Dockerfile如下:
FROM ubuntu:22.04 RUN groupadd -f -g 1000 docker \ && useradd -ms /bin/bash docker -u 1000 -g 1000 \ && chown docker:docker -R /home/docker \ && ls -la /home RUN ls -la /home
构建后,最后一步的ls输出会显示/home/docker的属主保持为docker:docker。
方案2:指定非/home路径的用户家目录
避开tmpfs挂载的/home,将用户家目录设置到其他持久化路径(比如/opt/docker):
FROM ubuntu:22.04 RUN groupadd -f -g 1000 docker \ && useradd -ms /bin/bash docker -u 1000 -g 1000 -d /opt/docker \ && chown docker:docker -R /opt/docker \ && ls -la /opt RUN ls -la /opt
此路径不在tmpfs上,权限修改会被持久化到镜像层。
方案3:禁用/home的tmpfs挂载
通过移除systemd相关配置,取消/home的临时挂载:
FROM ubuntu:22.04 RUN rm -f /etc/systemd/system/sysinit.target.wants/systemd-tmpfiles-setup.service \ && groupadd -f -g 1000 docker \ && useradd -ms /bin/bash docker -u 1000 -g 1000 \ && chown docker:docker -R /home/docker \ && ls -la /home RUN ls -la /home
后续RUN步骤中/home不再被重新挂载为tmpfs,修改会被保留。
内容的提问来源于stack exchange,提问作者András Fekete
相关产品推荐
相关产品推荐

