You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 11:45:26