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

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私有网络,必须用服务名/容器名作为主机,这是正常的网络差异,无需调整。


验证步骤

  1. 清理旧容器和镜像:docker-compose down -v --rmi all
  2. 重新构建并启动:docker-compose up --build
  3. 查看日志,确认API容器在db健康检查通过后启动,且迁移执行成功

内容的提问来源于stack exchange,提问作者dewable

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:20:42