Docker化Next.js应用时Prisma迁移报P1001:无法连接MySQL
问题:Docker化Next.js应用时Prisma迁移无法连接MySQL
执行docker-compose up -d部署Next.js+MySQL应用时,Prisma迁移环节报错:
Error: P1001: Can't reach database server at `mysql`:`3306`
核心问题分析
- 构建阶段无法访问MySQL容器:Dockerfile中的
RUN npx prisma migrate deploy属于镜像构建阶段的命令,此时MySQL容器还未启动(镜像构建完成后才会创建并启动容器),自然无法连接到MySQL服务。 - depends_on的局限性:docker-compose的
depends_on仅保证MySQL容器优先启动,但不会等待MySQL服务完全就绪(比如完成初始化、可以接受连接请求)。
解决方案1:将迁移移到容器启动时执行
修改Dockerfile,把迁移命令从构建阶段移到容器启动脚本中,确保MySQL服务就绪后再执行迁移:
FROM node:18 as development WORKDIR /usr/app COPY package*.json . RUN npm install -g pnpm # 安装netcat用于检测MySQL端口状态 RUN apt-get update && apt-get install -y netcat-traditional && rm -rf /var/lib/apt/lists/* RUN pnpm install COPY . . RUN npx prisma generate EXPOSE 3000 # 先等待MySQL端口开放,再执行迁移,最后启动开发服务 CMD ["sh", "-c", "until nc -z mysql 3306; do sleep 1; echo '等待MySQL启动...'; done; npx prisma migrate deploy; pnpm run dev"]
解决方案2:使用wait-for-it脚本等待服务就绪
借助wait-for-it.sh脚本更可靠地等待MySQL服务就绪:
- 下载脚本到项目根目录并添加执行权限:
curl -o wait-for-it.sh https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh chmod +x wait-for-it.sh
- 修改Dockerfile:
FROM node:18 as development WORKDIR /usr/app COPY package*.json . COPY wait-for-it.sh . RUN npm install -g pnpm RUN apt-get update && apt-get install -y bash && rm -rf /var/lib/apt/lists/* RUN pnpm install COPY . . RUN npx prisma generate EXPOSE 3000 # 等待MySQL服务就绪后执行迁移并启动服务 CMD ["sh", "-c", "./wait-for-it.sh mysql:3306 -- npx prisma migrate deploy && pnpm run dev"]
解决方案3:手动分步启动容器
如果不想修改配置文件,可以先单独启动MySQL容器,等其初始化完成后再启动前端:
# 启动MySQL容器 docker-compose up -d mysql # 等待MySQL初始化完成(约2分钟,可根据实际情况调整) sleep 120 # 启动前端容器 docker-compose up -d frontend
额外优化:修正MySQL容器Volume配置
你的docker-compose.yml中MySQL的Volume路径错误,默认数据目录是/var/lib/mysql,而非/var/lib/mysql/data,修正后才能正确持久化数据:
services: mysql: # ...其他配置 volumes: - ./data:/var/lib/mysql # 修正此处路径
内容的提问来源于stack exchange,提问作者Nayan Prasad P K
相关产品推荐
相关产品推荐

