You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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完成所有权限配置。

问题原因
  1. 命令语法错误:bash -c后的命令未用引号完整包裹,导致实际执行时仅运行了echo命令,后续的mysql命令并未执行。
  2. 权限范围错误:授权的是'user'@'localhost',但Python应用从主机连接,对应的是'user'@'%'(任意远程地址),权限不匹配。
  3. 破坏镜像初始化流程:直接覆盖command会跳过MariaDB镜像自带的初始化逻辑,导致MARIADB_USER等环境变量创建的用户未正确初始化。
解决方案(推荐使用初始化脚本)

MariaDB官方镜像支持在/docker-entrypoint-initdb.d/目录下放置SQL脚本,容器首次启动时会自动执行这些脚本,不会破坏默认初始化流程。

  1. 创建初始化脚本:在项目目录下新建init.sql文件,写入权限授权语句:
GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
  1. 修改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
  1. 重新启动容器:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 22:07:35