NVIDIA Jetson与x86平台Docker文件夹权限持久化差异问题
Docker文件夹权限跨构建层丢失问题(NVIDIA Jetson平台)
问题现象
在NVIDIA Jetson Orin NX(JetPack 5.1.1)上构建Docker镜像时,出现文件夹权限无法跨RUN指令层持久化的异常:
- 执行
chown -R vtc:vtc /whatever/folder/的RUN步骤中,权限显示为vtc:vtc,设置正常 - 下一个独立的RUN步骤里,该文件夹权限自动变回
root:root - 相同Dockerfile在x86架构Ubuntu 22.04笔记本上构建时,权限能稳定保持跨层一致
已清理所有镜像、卷并执行无缓存重建,排除了缓存、卷挂载、COPY命令等干扰因素,问题依旧存在。
复现用Dockerfile
FROM ubuntu RUN useradd -u 1000 vtc RUN echo "vtc:vtc" | chpasswd RUN mkdir -p /whatever/folder/ RUN chown -R vtc:vtc /whatever/folder/ && ls -la /whatever/folder/ RUN ls -la /whatever/folder/ WORKDIR /whatever/folder/ ENTRYPOINT [ "bash" ]
环境信息
Jetson平台Docker版本
Client: Version: 20.10.25 API version: 1.41 Go version: go1.18.1 Git commit: 20.10.25-0ubuntu1~20.04.1 Built: Fri Jul 14 22:01:07 2023 OS/Arch: linux/arm64 Context: default Experimental: true Server: Engine: Version: 20.10.25 API version: 1.41 (minimum version 1.12) Go version: go1.18.1 Git commit: 20.10.25-0ubuntu1~20.04.1 Built: Thu Jun 29 21:55:06 2023 OS/Arch: linux/arm64 Experimental: false containerd: Version: 1.7.2 GitCommit: nvidia: Version: 1.1.7-0ubuntu1~20.04.1 GitCommit: 629a689 docker-init: Version: 0.19.0 GitCommit:
x86平台Docker版本
Client: Docker Engine - Community Version: 24.0.2 API version: 1.43 Go version: go1.20.4 Git commit: cb74dfc Built: Thu May 25 21:51:00 2023 OS/Arch: linux/amd64 Context: default Server: Docker Engine - Community Engine: Version: 24.0.2 API version: 1.43 (minimum version 1.12) Go version: go1.20.4 Git commit: 659604f Built: Thu May 25 21:51:00 2023 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.6.21 GitCommit: 3dce8eb055cbb6872793272b4f20ed16117344f8 runc: Version: 1.1.7 GitCommit: v1.1.7-0-g860f061 docker-init: Version: 0.19.0 GitCommit: de40ad0
可能原因
- Docker版本兼容性:Jetson使用的是Ubuntu源提供的20.10.25旧版本,x86使用的是官方社区版24.0.2,旧版本可能存在arm64架构下的分层文件系统权限处理bug。
- NVIDIA容器运行时影响:Jetson上默认启用了nvidia容器runtime,可能在镜像层处理过程中意外覆盖了权限设置。
- 存储驱动差异:Jetson与x86平台的Docker存储驱动可能不同,导致权限元数据在层间同步时丢失。
解决方案尝试
方案1:合并RUN指令
将创建目录、修改权限的操作合并到同一个RUN指令中,利用Docker分层特性确保权限变更在同一层完成,避免跨层重置:
FROM ubuntu RUN useradd -u 1000 vtc && \ echo "vtc:vtc" | chpasswd && \ mkdir -p /whatever/folder/ && \ chown -R vtc:vtc /whatever/folder/ RUN ls -la /whatever/folder/ WORKDIR /whatever/folder/ ENTRYPOINT [ "bash" ]
方案2:升级Docker版本
将Jetson上的Docker升级为官方社区版(替代Ubuntu源版本),参考Docker官方arm64安装指南或NVIDIA Jetson相关文档完成升级,验证新版本是否修复该权限问题。
方案3:切换默认容器runtime
临时修改Docker daemon的默认runtime为runc,排除nvidia runtime的干扰后重新构建:
# 临时启动dockerd并指定默认runtime sudo dockerd --default-runtime runc & # 无缓存构建镜像 docker build --no-cache -t test-perm .
内容的提问来源于stack exchange,提问作者G. Ballegeer
相关产品推荐
相关产品推荐

