Docker化Nestjs+MySQL+phpMyAdmin时Prisma无法连接localhost:3306
问题:Docker化部署NestJS+MySQL+phpMyAdmin后数据库连接失败
错误信息
容器启动后NestJS控制台报错:
Error: Can't reach database server at `localhost`:`3306` at r /usr/src/app/node_modules/.pnpm/@prisma+client@4.15.0_prisma@4.15.0/node_modules/@prisma/client/runtime/library.js:108:2574)
本地操作情况
本地执行迁移与数据填充命令正常:
➜ my_app git:(master) ✗ npx prisma db push --force-reset && npx prisma db seed Datasource "db": MySQL database "my_app" at "localhost:3306" The MySQL database "my_app" at "localhost:3306" was successfully reset. npm notice Environment variables loaded from .env Running seed command `ts-node prisma/seed.ts` ... 🌱 The seed command has been executed.
异常代码片段
以下数据库查询代码无法正常运行:
async signUp(@Body() dto: AuthDto):Promise<any> { return await this.prisma.user.findUnique( { where: { mobileNumber: dto.mobileNumber } } ); }
相关配置文件
docker-compose.yaml
networks: host: name: my_app external: true lan_access: driver: bridge services: my_app: build: context: . dockerfile: src/Dockerfile target: development command: npm run start:dev my_app env_file: - src/.env volumes: - .:/usr/src/app - /usr/src/app/node_modules networks: - default ports: - '80:3000' database: image: mysql:latest restart: always command: --default-authentication-plugin=mysql_native_password environment: MYSQL_DATABASE: 'my_db' MYSQL_PASSWORD: 'root' MYSQL_ROOT_PASSWORD: 'root' ports: - '3306:3306' expose: - '3306' volumes: - my-db:/var/lib/mysql phpmyadmin: image: phpmyadmin:latest restart: always ports: - 8080:80 environment: - PMA_ARBITRARY=1 volumes: my-db:
Dockerfile
# Development stage FROM node:alpine As development WORKDIR /usr/src/app COPY package*.json ./ COPY prisma ../../prisma/ RUN npm install -g pnpm RUN pnpm install --save COPY . . RUN npm run build # Production stage FROM node:alpine as production ARG NODE_ENV=production ENV NODE_ENV=${NODE_ENV} WORKDIR /usr/src/app COPY package*.json ./ COPY prisma ../../prisma/ RUN npm install -g pnpm RUN pnpm install --only=production COPY . . COPY --from=development /usr/src/app/dist ./dist COPY --chown=node:node --from=builder /usr/src/app/prisma /prisma CMD ["node", "dist/src/amanpaz/main"]
解决方案
1. 修改数据库连接地址(核心问题)
在src/.env文件中,将数据库连接地址的localhost替换为Docker Compose中MySQL服务的名称database,同时确保数据库名与docker-compose配置一致:
# 修改后配置(容器内可用) DATABASE_URL="mysql://root:root@database:3306/my_db"
注意:docker-compose中MySQL初始化的数据库名为
my_db,需与连接地址中的库名保持一致;本地迁移用的my_app是宿主机上的独立数据库,与容器内数据库无关。
2. 确认网络连通性
my_app与database服务默认共用default网络,Docker Compose会自动为同网络内的服务提供DNS解析,通过服务名database即可直接访问MySQL服务,无需额外网络配置。
3. 重启容器
执行以下命令重新构建并启动容器:
docker-compose down && docker-compose up --build
补充说明
- 本地执行迁移时用
localhost:3306是因为宿主机通过端口映射直接访问MySQL容器;但容器内的NestJS服务中,localhost指向容器自身,无法连接到外部的MySQL服务。 - phpMyAdmin可通过
localhost:8080访问,在登录界面输入database:3306即可连接容器内的MySQL服务。
内容的提问来源于stack exchange,提问作者DolDurma
相关产品推荐
相关产品推荐

