ARM64机器Docker容器内Root用户无法执行apt-get及文件创建求助
看起来你在ARM64设备(内核4.14)上运行Docker 18.09.1时,遇到了容器内权限异常的棘手问题——明明是root用户,却无法执行apt操作、不能创建文件。我帮你梳理下问题根源和可行的解决步骤:
先确认你的环境信息
- 架构:ARM64
- 内核版本:4.14
- Docker版本:
Docker version 18.09.1, build 4c52b90 - 存储驱动:overlay2
问题核心分析
从你提供的mount输出能看到,容器根目录/挂载参数是rw(理论上可读写),但大量cgroup子系统被设为ro只读,同时部分proc子目录也处于只读状态。结合你遇到的Operation not permitted错误,大概率是Docker的权限限制、内核安全模块(如SELinux/AppArmor)或者老版本Docker与内核的兼容性问题导致的。
分步解决办法
1. 先尝试赋予容器更多权限启动
Docker默认会收紧容器的权限,你可以先尝试添加必要的权限重新启动容器:
docker run -it --cap-add=SYS_ADMIN ubuntu:16.04 /bin/bash
如果还是不行,可以用--privileged参数测试(注意:这个参数会给容器几乎主机级的权限,仅限排查问题,生产环境别随便用):
docker run -it --privileged ubuntu:16.04 /bin/bash
进入容器后再试试创建文件或者apt-get update,看是否恢复正常。
2. 检查Docker守护进程的默认配置
看看Docker的配置文件/etc/docker/daemon.json有没有默认开启了只读模式或者其他限制:
cat /etc/docker/daemon.json
如果里面有"read-only": true这类配置,先注释掉,然后重启Docker服务:
systemctl restart docker
之后重新启动容器测试。
3. 排查内核安全模块的影响
ARM64设备可能启用了SELinux或AppArmor,这些安全模块会限制容器的操作:
- 检查SELinux状态:
getenforce
如果输出是Enforcing,可以临时改成Permissive模式试试:
setenforce 0
然后重启容器验证。
- 检查AppArmor状态:
aa-status
如果AppArmor启用了且对Docker有严格的规则,可以临时禁用默认的Docker profile:
aa-disable docker-default
测试完记得恢复安全配置,别一直开着。
4. 升级Docker版本
你用的Docker 18.09.1确实比较老了,可能和内核4.14存在兼容性问题。建议升级到更稳定的新版本(比如20.10.x系列),ARM64版本可以用官方脚本安装:
curl -fsSL https://get.docker.com | sh
升级后重启Docker服务,再测试容器操作。
5. 更换容器镜像试试
有些老版本的Ubuntu 16.04 ARM镜像可能有兼容性问题,你可以试试官方维护的更新镜像,或者换用Ubuntu 18.04/20.04的ARM镜像:
docker run -it ubuntu:18.04 /bin/bash
额外排查点
如果以上方法都没用,检查下主机上Docker数据目录的权限:
ls -ld /opt/var/lib/docker
正常情况下应该是root:root拥有,权限为drwx--x--x,如果权限不对,调整后重启Docker。
内容的提问来源于stack exchange,提问作者wj.sim

