Docker Compose中MariaDB磁盘卷绑定失效,命名卷正常问题求助
问题背景
在Mac M1设备上使用Docker Compose部署MariaDB时,绑定本地磁盘卷(已设置文件夹777权限)无法正常工作:Workbench连接时提示“Tables could not be fetched”,无法获取表数据,进而导致Keycloak实例无法启动。但使用Docker命名卷时,服务可正常运行。需要修复磁盘卷绑定问题以实现数据持久化备份。
失效的磁盘挂载配置
version: '3' services: mysql: # image: docker.io/mariadb:11.0.2 image: mariadb:latest environment: MARIADB_DATABASE: dbkc MARIADB_ROOT_PASSWORD: root MARIADB_PASSWORD: admin MARIADB_USER: admin ports: - 3306:3306 volumes: - ~/Downloads/mysqldata:/var/lib/mysql
正常工作的命名卷配置
version: '3' services: mysql: # image: docker.io/mariadb:11.0.2 image: mariadb:latest environment: MARIADB_DATABASE: dbkc MARIADB_ROOT_PASSWORD: root MARIADB_PASSWORD: admin MARIADB_USER: admin ports: - 3306:3306 volumes: - my-datavolume:/var/lib/mysql volumes: my-datavolume:
关键日志信息
磁盘卷绑定模式下,MariaDB日志出现提示:Warning] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
命名卷与磁盘卷的运行日志存在差异,导致数据库初始化或数据读取异常。
修复方案尝试
1. 修正本地目录的权限归属
容器内MariaDB默认以mysql用户(UID/GID通常为999)运行,仅设置777权限可能无法满足容器内用户的读写需求,执行以下命令调整本地目录权限:
sudo chown -R 999:999 ~/Downloads/mysqldata
2. 统一大小写敏感配置
Mac本地文件系统为大小写不敏感,而Docker命名卷使用的内部文件系统为大小写敏感,导致数据库配置不一致。在docker-compose.yml中添加环境变量强制指定lower_case_table_names=2:
services: mysql: # ... 其他配置不变 ... environment: # ... 原有环境变量 ... lower_case_table_names: 2
或者挂载自定义配置文件my.cnf:
创建my.cnf文件:
[mysqld] lower_case_table_names=2
修改docker-compose.yml的volumes部分:
volumes: - ~/Downloads/mysqldata:/var/lib/mysql - ./my.cnf:/etc/mysql/conf.d/my.cnf
3. 清理本地目录残留数据
若本地目录存在之前的残留数据,可能导致初始化异常,先清空目录再重启容器:
rm -rf ~/Downloads/mysqldata/* docker-compose down && docker-compose up -d
4. 检查Docker文件共享设置
打开Docker Desktop偏好设置,确认~/Downloads已添加到文件共享列表中,否则容器无法访问该本地目录。
内容的提问来源于stack exchange,提问作者MaduKan

