跨Windows与Ubuntu系统Docker LAMP环境MySQL数据共享配置问题
解决方案:NTFS共享分区下Docker MySQL权限问题修复
一、调整NTFS分区挂载参数(/etc/fstab)
NTFS本身不支持Linux的POSIX权限体系,只能通过挂载参数模拟权限映射。之前的配置把分区GID设为999,但Docker又强制用1000:1000用户,导致权限完全不匹配。直接把分区所有者映射为MySQL容器默认的mysql用户(UID/GID均为999):
UUID=xxx /mnt/share ntfs defaults,uid=999,gid=999,fmask=0002,dmask=0002 0 0
参数说明:
uid=999,gid=999:将NTFS分区所有文件/目录的所有者直接对应到MySQL容器内的mysql用户fmask=0002:文件权限设为775(-rwxrwxr-x),保证所有者和组有完整读写执行权限dmask=0002:目录权限设为775,确保容器能正常访问、创建目录
修改后重新挂载分区:
sudo umount /mnt/share sudo mount -a
二、调整Docker Compose配置
不需要强制给MySQL容器指定1000:1000用户,让它用默认的mysql用户即可,同时简化数据卷配置:
修改后的docker-compose.yml
version: "3.1" services: www: build: context: . dockerfile: Dockerfile.lamp user: 1000:1000 ports: - "${WEBSERVER_PORT}:80" volumes: - ./www:/var/www/html/ networks: - default db: image: mysql:8.0 # 移除user:1000:1000,用容器默认的mysql用户(UID/GID 999) ports: - "3306:3306" command: --default-authentication-plugin=mysql_native_password environment: MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD} volumes: - ./sql:/docker-entrypoint-initdb.d - ./conf:/etc/mysql/conf.d # 直接绑定主机目录,省去named volume的冗余配置 - ./mysql_data:/var/lib/mysql networks: - default phpmyadmin: image: phpmyadmin/phpmyadmin ports: - ${PHPMYADMIN_PORT}:80 networks: - default environment: MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD} UPLOAD_LIMIT: 64M PMA_HOST: db # 明确指定连接的MySQL服务名,避免连接失败 networks: default:
三、初始化目录(关键步骤)
如果之前已经创建过mysql_data目录,先清理旧数据避免冲突:
- 停止并删除现有容器及数据卷:
docker-compose down -v
- 手动创建
mysql_data目录(如果不存在):
mkdir -p ./mysql_data
因为NTFS挂载后目录所有者已经是999:999,不需要执行chown(NTFS不支持该命令)
四、验证运行
启动容器:
docker-compose up -d
查看MySQL容器日志,确认没有权限报错:
docker-compose logs db
访问phpMyAdmin测试登录,创建数据库/表验证数据写入正常即可。
补充注意事项
- 双系统切换时,确保Windows下没有打开共享分区内的文件,否则Ubuntu可能会以只读模式挂载分区,导致MySQL无法写入
- NTFS不支持Linux特殊权限(SUID/SGID等),但MySQL运行不需要这些权限,上述配置完全满足需求
内容的提问来源于stack exchange,提问作者Mart
相关产品推荐
相关产品推荐

