Docker运行docker-compose未生成MySQL容器且无法连接数据库问题咨询
问题产生的原因
- 环境变量配置错误:你
.env文件中的DB_USERNAME参数值设为了root,但MySQL官方Docker镜像的MYSQL_USER环境变量是用来创建普通权限用户的,不允许设为root,这是容器启动直接退出的核心原因。 - MySQL配置文件错误:你本地挂载的
./docker-compose/mysql/my.cnf中配置了secure_file_priv = /var/lib/mysql-files,但容器内不存在这个目录,也没有做挂载映射,导致MySQL配置校验不通过,启动中止。 - docker-compose.yml配置不匹配:你定义的MySQL服务名称是
testApp,但app和nginx服务的depends_on依赖写的是db,找不到对应的依赖服务,也会影响启动逻辑。
修复步骤
第一步:修正.env文件的数据库账号配置
将.env中的DB_USERNAME修改为非root的普通用户名,比如dbuser这类自定义名称即可,不要和root重名。
# 示例修改 DB_USERNAME=dbuser DB_PASSWORD=你原来设置的密码
第二步:修正MySQL配置或者补充目录挂载
两种方案二选一即可:
- 方案1(推荐):修改你本地的
./docker-compose/mysql/my.cnf,删除secure_file_priv相关配置,或者将值改为空、/var/lib/mysql这类容器内已存在的目录。 - 方案2:在docker-compose.yml的testApp服务的volumes配置中新增一行,挂载mysql-files目录:
同时在底部的volumes段落新增mysql-files的声明:volumes: - dbdata:/var/lib/mysql - ./docker-compose/mysql/my.cnf:/etc/mysql/my.cnf - ./docker-compose/mysql/init:/docker-entrypoint-initdb.d - mysql-files:/var/lib/mysql-files # 新增这行volumes: dbdata: driver: local mysql-files: driver: local
第三步:修正docker-compose.yml中的依赖配置
把app和nginx服务的depends_on中的db改成testApp,和你实际的MySQL服务名保持一致:
services: app: # 其他配置不变 depends_on: - testApp # 原来的db改成testApp nginx: # 其他配置不变 depends_on: - testApp # 原来的db改成testApp - app
第四步:清理旧容器和卷后重启
因为之前启动失败留下了异常的容器和数据卷,需要先清理再重启:
# 停止并删除所有现有容器、卷 docker-compose down -v # 重新构建启动 docker-compose up -d --build
修复完成后执行docker ps就能看到MySQL容器正常运行,API请求也能正常连接数据库。
内容的提问来源于stack exchange,提问作者sp92
相关产品推荐
相关产品推荐

