Ubuntu16.04下Docker Compose启动MySQL服务失败:配置目录不存在报错
解决MySQL容器启动报错:找不到/etc/mysql/mysql.conf.d目录的问题
嘿,我来帮你搞定这个头疼的问题!从你给出的报错信息mysqld: can't read dir of '/etc/mysql/mysql.conf.d' (os errno 2 - no such file or directory)来看,核心问题就是容器里的MySQL服务找不到它需要的配置目录。咱们一步步排查解决:
可能的原因&解决方案
1. 检查Docker镜像构建逻辑
你在docker-compose-dev.yml里给db服务配置了build: ./docker/mysql,说明Docker会用这个目录下的Dockerfile来构建镜像:
- 先打开
./docker/mysql/Dockerfile,确认是不是基于官方MySQL镜像(比如FROM mysql:5.7这类)。官方镜像默认自带/etc/mysql/mysql.conf.d目录,如果你的Dockerfile里有删除这个目录的操作,或者用了没有该结构的自定义基础镜像,肯定会报错。 - 如果Dockerfile没问题,那可能是构建缓存搞的鬼,试试强制重新构建镜像:
docker-compose -f docker-compose-dev.yml build --no-cache db
2. 配置本地目录挂载(适配自定义/默认配置)
从你给出的docker-compose-dev.yml片段来看,你只挂载了数据目录到/var/lib/mysql,但没处理配置目录。如果本地./docker/mysql没有mysql.conf.d,或者没挂载到容器对应路径,就会导致容器找不到该目录:
- 先在本地创建对应的配置目录:
mkdir -p ./docker/mysql/mysql.conf.d - 如果你需要用官方默认配置,可以临时启动一个官方MySQL容器,把配置复制到本地:
# 启动临时容器 docker run --rm -d --name temp-mysql mysql:5.7 # 复制配置目录到本地 docker cp temp-mysql:/etc/mysql/mysql.conf.d ./docker/mysql/ # 停止临时容器 docker stop temp-mysql - 然后修改
docker-compose-dev.yml里的volumes部分,添加配置目录的挂载:volumes: - ./docker/mysql/data:/var/lib/mysql - ./docker/mysql/mysql.conf.d:/etc/mysql/mysql.conf.d
3. 排查目录权限问题
Ubuntu系统下的目录权限可能影响Docker挂载效果,容器里的MySQL进程通常用uid为999的用户,确保本地./docker/mysql目录及其子目录能被这个用户访问:
sudo chown -R 999:999 ./docker/mysql
验证修复效果
完成上面的操作后,重新启动db服务:
docker-compose -f docker-compose-dev.yml up -d db
然后查看容器日志,确认服务正常启动:
docker logs erentpay_db_1
内容的提问来源于stack exchange,提问作者Matteo Cacciola
相关产品推荐
相关产品推荐

