Prisma无法连接Docker中的MySQL容器问题求助
解决Docker Compose中Node/Prisma无法连接MySQL容器的问题
核心问题分析
你遇到的P1001错误主要来自三个关键配置问题:构建阶段提前执行数据库迁移、容器启动顺序不保证数据库就绪、以及网络别名的正确使用逻辑。
具体修复步骤
1. 移除构建阶段的数据库迁移命令
你的Dockerfile中RUN npm run db-prod是在镜像构建阶段执行的,此时Docker Compose的服务网络还未创建,db容器根本不存在,必然连接失败。
修改Dockerfile,把迁移命令放到容器启动时执行:
FROM node:latest WORKDIR /usr/src/app COPY package*.json ./ COPY .env ./ COPY prisma ./prisma/ RUN npm ci # 移除构建阶段的db-prod命令 # RUN npm run db-prod COPY . . EXPOSE 3200 # 注意:容器内服务端口是3200,docker-compose映射的是5001:3200 # 先执行迁移,再启动服务 CMD ["sh", "-c", "npm run db-prod && npm start"]
2. 修正DATABASE_URL的主机名
在Docker Compose的默认网络中,服务名db是容器的DNS别名,容器名mysql虽能解析,但推荐用服务名(更符合Compose设计逻辑)。确保.env文件的URL为:
DATABASE_URL=mysql://root:root@db:3306/myshowlist
3. 确保数据库完全就绪后再启动API容器
depends_on: [db]只保证db容器先启动,但不保证MySQL服务完成初始化(MySQL 5.7启动后需几秒初始化时间)。给db容器添加健康检查,让API容器等数据库就绪后再启动:
修改docker-compose.yml:
version: "3.8" services: api: build: context: ./api-old ports: - "5001:3200" container_name: api depends_on: db: condition: service_healthy # 等待db容器健康检查通过 db: image: mysql:5.7 restart: always container_name: mysql ports: - "3306:3306" environment: MYSQL_DATABASE: myshowlist MYSQL_ROOT_PASSWORD: root # 去掉多余引号,避免解析问题 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot"] interval: 5s timeout: 5s retries: 5
4. 理解本地与容器内连接的差异
本地直接连MySQL容器用localhost是因为端口映射到了宿主机,但容器内属于Docker私有网络,必须用服务名/容器名作为主机,这是正常的网络差异,无需调整。
验证步骤
- 清理旧容器和镜像:
docker-compose down -v --rmi all - 重新构建并启动:
docker-compose up --build - 查看日志,确认API容器在db健康检查通过后启动,且迁移执行成功
内容的提问来源于stack exchange,提问作者dewable
相关产品推荐
相关产品推荐

