Docker Compose部署MySQL遇binlog.index权限拒绝问题求助
MySQL容器启动失败(权限问题)解决方案
核心问题定位
日志中关键错误:
mysqld: File './binlog.index' not found (OS errno 13 - Permission denied)
这是因为本地挂载的./db目录权限不足,MySQL容器内的mysql用户(UID/GID 999)无法读写该目录,导致无法创建必要的日志文件。
解决方法
1. 修复本地挂载目录权限
执行以下命令,将./db目录的所有权转移给MySQL容器内的用户:
sudo chown -R 999:999 ./db
如果是Windows系统,右键db目录 → 属性 → 安全,为Everyone添加读写权限(或指定Docker相关用户)。
2. 使用Docker管理卷替代本地挂载(无权限问题)
修改docker-compose.yml,将本地目录挂载改为Docker内部卷:
version: "3.9" services: mysql: image: mysql/mysql-server:8.0.32 container_name: mysql-database environment: MYSQL_DATABASE: book # 修正为Spring Boot连接的数据库名 MYSQL_USER: username MYSQL_PASSWORD: pass MYSQL_ROOT_PASSWORD: pass MYSQL_ROOT_HOST: '%' MYSQL_PORT: 3306 volumes: - mysql-data:/var/lib/mysql # 替换为内部卷 ports: - "3306:3306" project-be: build: context: . dockerfile: Dockerfile container_name: project-be ports: - "9790:9790" depends_on: - mysql environment: - SPRING_PROFILES_ACTIVE=development - DB_USERNAME=username - DB_PASSWORD=pass - DB_URL=jdbc:mysql://host.docker.internal:3306/book # 新增全局卷定义 volumes: mysql-data:
这种方式数据由Docker管理,不会出现权限问题,但数据不会保存在本地项目目录中。
3. 修正数据库名不一致问题
注意到docker-compose.yml中MYSQL_DATABASE设置为username,但Spring Boot的DB_URL指向的数据库是book,两者不一致会导致后续连接失败,建议将MYSQL_DATABASE改为book(如上代码所示)。
内容的提问来源于stack exchange,提问作者Sercan Noyan Germiyanoğlu
相关产品推荐
相关产品推荐

