Docker+Prisma连接MySQL容器失败:P1001错误求助
解决Docker/Prisma P1001数据库连接失败问题
排查步骤与解决方案
1. 确认容器在同一Docker网络
分开启动容器时,Docker可能会为每个容器分配独立默认网络,导致彼此无法通信:
- 执行
docker network ls查看现有网络列表 - 检查数据库容器所在网络:
docker inspect masterapp-dev-db | grep -A 5 Networks - 检查服务容器所在网络:
docker inspect server-dev | grep -A 5 Networks - 若不在同一网络,手动将服务容器加入数据库容器的网络:
docker network connect <数据库容器网络名> server-dev - 更稳妥的方式是在
docker-compose.yml中为两个服务指定同一自定义网络:
配置完成后重新启动两个容器。networks: app-network: driver: bridge services: masterapp-dev-db: # 其他配置 networks: - app-network server-dev: # 其他配置 networks: - app-network
2. 修正Prisma连接端口
服务容器与数据库容器在同一网络内时,需访问数据库容器内部的3306端口,而非宿主机映射的3310端口:
- 确保Prisma的
DATABASE_URL格式为:mysql://<用户名>:<密码>@masterapp-dev-db:3306/<数据库名>
3. 清除Prisma缓存并重新生成客户端
Prisma可能缓存旧连接配置,导致新地址不生效:
- 进入服务容器:
docker exec -it server-dev sh - 执行
npx prisma generate重新生成客户端 - 重启服务容器:
docker restart server-dev
4. 确保数据库容器完全就绪
数据库容器启动后,内部服务可能需要几秒时间初始化,此时服务容器连接会失败:
- 查看数据库容器日志确认就绪:
docker logs masterapp-dev-db,需出现ready for connections类日志 - 可在
docker-compose.yml中为服务容器添加依赖等待配置:server-dev: # 其他配置 depends_on: masterapp-dev-db: condition: service_healthy masterapp-dev-db: # 其他配置 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] timeout: 20s retries: 10
5. 检查数据库用户访问权限
确保数据库用户允许从服务容器所在网络访问:
- 进入数据库容器:
docker exec -it masterapp-dev-db mysql -u <用户名> -p - 执行授权命令:
GRANT ALL PRIVILEGES ON <数据库名>.* TO '<用户名>'@'%' IDENTIFIED BY '<密码>'; - 刷新权限:
FLUSH PRIVILEGES;
内容的提问来源于stack exchange,提问作者Mislav
相关产品推荐
相关产品推荐

