插件窝 干货文章 Docker Compose 部署 MySQL 失败:为何出现 “mysqld: Can't read dir of '/etc/mysql/conf.d/'” 错误?

Docker Compose 部署 MySQL 失败:为何出现 “mysqld: Can't read dir of '/etc/mysql/conf.d/'” 错误?

MySQL 挂载 目录 conf 81    来源:    2025-03-31

Docker Compose 部署 MySQL 出现 "/etc/mysql/conf.d/" 目录读取错误分析

错误原因分析

这个错误通常发生在 Docker 容器中的 MySQL 服务尝试访问 /etc/mysql/conf.d/ 目录时遇到权限问题或目录不存在。具体可能原因包括:

  1. 目录未正确挂载:在 docker-compose.yml 中配置的 volume 挂载不正确
  2. 目录权限问题:容器内 MySQL 用户没有访问该目录的权限
  3. 目录不存在:指定的配置目录在容器内或主机上不存在
  4. SELinux/AppArmor 限制:在某些 Linux 系统上安全模块限制了访问

解决方案

方案1:确保正确挂载配置目录

docker-compose.yml 中正确配置 volumes:

services:
  mysql:
    image: mysql:latest
    volumes:
      - ./mysql/conf.d:/etc/mysql/conf.d
      - mysql_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: yourpassword
volumes:
  mysql_data:

确保主机上的 ./mysql/conf.d 目录存在且可读:

mkdir -p ./mysql/conf.d
chmod -R 644 ./mysql/conf.d

方案2:检查并修复目录权限

如果目录已存在但权限不足:

# 在主机上执行
chown -R 999:999 ./mysql/conf.d  # MySQL 容器通常使用 999:999 用户
chmod -R 755 ./mysql/conf.d

方案3:使用默认配置(不挂载自定义配置)

如果不需要自定义配置,可以完全移除 volumes 中关于 conf.d 的挂载:

services:
  mysql:
    image: mysql:latest
    volumes:
      - mysql_data:/var/lib/mysql
    # 移除 conf.d 挂载

方案4:检查 SELinux/AppArmor 限制

对于 SELinux:

chcon -Rt svirt_sandbox_file_t ./mysql/conf.d

或临时禁用 SELinux 进行测试:

setenforce 0

验证步骤

  1. 检查目录是否存在:

    docker exec -it your_mysql_container ls -la /etc/mysql/conf.d
    
  2. 检查 MySQL 错误日志:

    docker logs your_mysql_container
    
  3. 检查容器内权限:

    docker exec -it your_mysql_container id
    docker exec -it your_mysql_container ls -la /etc/mysql
    

预防措施

  1. 始终确保挂载的目录在主机上存在
  2. 为挂载目录设置适当的权限
  3. 在开发环境中,可以先不挂载配置目录测试基本功能
  4. 考虑使用官方 MySQL 镜像的默认配置,除非确实需要自定义

通过以上方法,应该能够解决 "Can't read dir of '/etc/mysql/conf.d/'" 错误并成功部署 MySQL 容器。