Release v1.2.2 - 可写目录修复
Release v1.2.2 - 可写目录修复
🐛 Bug修复
这是v1.2.1的紧急修复版本,解决了可写目录绑定挂载未生效导致的权限错误问题。
修复的问题
Nginx权限拒绝错误 ❌ → ✅
nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)
2026/01/14 06:39:00 [emerg] 31595#31595: open() "/var/log/nginx/error.log" failed (13: Permission denied)
根本原因:
- v1.2.0实现了可写目录功能,但绑定挂载条件判断有误
- 代码检查
args.rootfs_dir是否存在,但在直接运行容器时该参数为None - 导致可写目录的绑定挂载从未被添加到proot命令中
- nginx等应用无法写入
/var/log等系统目录
解决方案:
- ✅ 使用
self.rootfs_dir而不是args.rootfs_dir来判断 - ✅ 在Android环境中总是创建可写目录绑定
- ✅ 修改
_prepare_writable_directories参数逻辑 - ✅ 确保临时容器和持久化容器都能使用可写目录
📦 安装
最新版本(推荐)
curl -sSL https://raw.githubusercontent.com/jinhan1414/android-docker-cli/v1.2.2/scripts/install.sh | sh使用环境变量
INSTALL_VERSION=v1.2.2 curl -sSL https://raw.githubusercontent.com/jinhan1414/android-docker-cli/main/scripts/install.sh | sh依赖安装
# Android Termux
pkg update && pkg install python proot curl tar
# Ubuntu/Debian
sudo apt install python3 proot curl tar🔍 验证修复
现在nginx应该可以正常运行,不再有权限错误:
# 拉取镜像
docker pull m.daocloud.io/docker.io/library/nginx:alpine
# 运行容器
docker run -d --name test-nginx m.daocloud.io/docker.io/library/nginx:alpine
# 查看日志(应该没有权限错误)
docker logs test-nginx
# 应该看到类似输出:
# /docker-entrypoint.sh: Configuration complete; ready for start up
# (没有 "Permission denied" 错误)📝 技术细节
修改的文件
android_docker/proot_runner.py-_build_proot_command()和_prepare_writable_directories()方法tests/test_android_permissions.py- 更新测试以匹配新的参数
代码变更
v1.2.1(有问题的代码):
# 只有当args.rootfs_dir存在时才添加可写目录
if hasattr(args, 'rootfs_dir') and args.rootfs_dir:
container_dir = os.path.dirname(args.rootfs_dir)
writable_binds = self._prepare_writable_directories(container_dir)
default_binds.extend(writable_binds)v1.2.2(修复后的代码):
# 在Android环境中总是添加可写目录
if self.rootfs_dir:
writable_binds = self._prepare_writable_directories(self.rootfs_dir)
default_binds.extend(writable_binds)
logger.info("已启用Android可写目录支持")可写目录列表
以下目录会被自动绑定挂载到主机侧的可写目录:
/var/log- 日志文件/var/cache- 缓存文件/var/tmp- 临时文件/tmp- 临时文件/run- 运行时文件
🎯 影响范围
此修复影响所有需要写入系统目录的应用,包括但不限于:
- nginx - 需要写入日志
- apache - 需要写入日志和缓存
- 数据库应用 - 需要写入临时文件
- 任何需要写入
/var/log、/tmp等目录的应用
⚠️ 已知限制
与v1.2.0相同:
- Whiteout文件语义: 层删除语义可能不完全保留,但不影响容器正常运行
- 文件权限: 某些文件权限操作在Android文件系统上可能无法按预期工作
- 进程隔离: proot提供进程隔离但不是完整的容器化
📊 变更统计
- 修改的文件: 2个
- 新增代码: 12行
- 删除代码: 9行
- 测试: 所有9个测试通过 ✅
🔗 相关链接
🙏 致谢
感谢用户持续反馈和测试!
📈 版本历史
- v1.2.0: 初始Android权限修复(whiteout文件、可写目录、Android检测)
- v1.2.1: 放宽关键文件验证,支持非标准镜像布局
- v1.2.2: 修复可写目录绑定挂载未生效的问题 ✅
完整提交: 9bfafe1
发布日期: 2026-01-14
修复版本: v1.2.1 → v1.2.2