Docker Compose部署MariaDB遇权限问题:无法创建数据库
问题描述
通过Docker Compose创建MariaDB实例,希望指定用户拥有创建和修改数据库的权限,当前配置的docker-compose.yml如下:
version: '3.1' services: db: image: mariadb restart: always environment: MARIADB_ROOT_PASSWORD: example MARIADB_USER: user MARIADB_PASSWORD: example command: > bash -c echo "GRANT ALL PRIVILEGES ON *.* TO 'user'@'localhost' WITH GRANT OPTION;" mysql -u root -pexample -h localhost volumes: - C:\db-data:/var/lib/mysql ports: - "3306:3306" adminer: image: adminer restart: always ports: - 8080:8080
主机上的Python执行CREATE DATABASE DB;时报错:
Access denied for user 'user'@'%' to database 'DB'
配置中的bash命令未生效,希望仅通过docker compose up完成所有权限配置。
问题原因
- 命令语法错误:
bash -c后的命令未用引号完整包裹,导致实际执行时仅运行了echo命令,后续的mysql命令并未执行。 - 权限范围错误:授权的是
'user'@'localhost',但Python应用从主机连接,对应的是'user'@'%'(任意远程地址),权限不匹配。 - 破坏镜像初始化流程:直接覆盖
command会跳过MariaDB镜像自带的初始化逻辑,导致MARIADB_USER等环境变量创建的用户未正确初始化。
解决方案(推荐使用初始化脚本)
MariaDB官方镜像支持在/docker-entrypoint-initdb.d/目录下放置SQL脚本,容器首次启动时会自动执行这些脚本,不会破坏默认初始化流程。
- 创建初始化脚本:在项目目录下新建
init.sql文件,写入权限授权语句:
GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
- 修改
docker-compose.yml:移除原有command配置,添加脚本挂载:
version: '3.1' services: db: image: mariadb restart: always environment: MARIADB_ROOT_PASSWORD: example MARIADB_USER: user MARIADB_PASSWORD: example volumes: - C:\db-data:/var/lib/mysql - ./init.sql:/docker-entrypoint-initdb.d/init.sql # 挂载初始化脚本 ports: - "3306:3306" adminer: image: adminer restart: always ports: - 8080:8080
- 重新启动容器:
docker compose down -v # 清除旧数据卷(首次初始化需要) docker compose up -d
备选方案(修复command命令)
如果一定要用command,需要修正语法并确保执行完授权后启动MariaDB服务,但不推荐这种方式,因为会跳过镜像的默认初始化:
command: > bash -c " echo \"GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;\" | mysql -u root -p${MARIADB_ROOT_PASSWORD} -h localhost; exec mysqld "
注意:使用此方案时,需要确保
MARIADB_USER已经被创建,如果镜像默认初始化被干扰,可能需要手动创建用户,因此优先推荐初始化脚本方案。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

