docker-compose.yml数据库配置问题:新建Prisma项目仍连旧数据库
问题分析与解决方案
首先,你遇到的问题核心源于两个关键误解:
1. Prisma配置中databases下的键并非MySQL实际数据库名
你修改的default→default2只是Prisma服务内部的数据库别名,和MySQL中实际创建的数据库名称没有直接关联。Prisma默认会在MySQL中创建名为default的数据库(未指定时),不管你给这个别名起什么名字,只要连接的是同一个MySQL实例,就会复用已有的数据库。
2. MySQL持久化卷导致数据共享
你的docker-compose中使用了命名卷mysql,这个卷会持久化MySQL的数据目录/var/lib/mysql。即使你启动新的Prisma容器,只要MySQL服务还是挂载这个卷,里面的旧数据库(包括第一个项目创建的default库)就会一直存在,新的Prisma服务依然会读取到这些数据。
正确解决方法
方法一:完全隔离的新项目(推荐用于独立开发环境)
为第二个项目创建独立的Prisma和MySQL服务,修改端口、卷名、密码等,避免和第一个项目冲突:
version: '3' services: prisma-project2: image: prismagraphql/prisma:1.8 restart: always ports: - "4467:4466" # 使用新端口,避免和第一个项目的4466端口冲突 environment: PRISMA_CONFIG: | port: 4466 databases: default: connector: mysql host: mysql-project2 port: 3306 user: root password: prisma-project2 migrations: true mysql-project2: image: mysql:5.7 restart: always environment: MYSQL_ROOT_PASSWORD: prisma-project2 volumes: - mysql-project2:/var/lib/mysql # 使用新的命名卷,完全隔离数据 volumes: mysql-project2:
执行docker-compose up -d后,这个新的MySQL实例是完全干净的,prisma deploy时会创建全新的数据库。
方法二:在同一个MySQL实例中创建新数据库
如果你想复用现有的MySQL服务,只需要在第二个项目的prisma.yml中指定新的数据库名称:
在生成的prisma.yml里添加一行:
database: my-second-project-db
然后执行prisma deploy,Prisma会自动在MySQL中创建名为my-second-project-db的新数据库,不会和第一个项目的default库冲突。
方法三:重置现有MySQL卷(会丢失旧数据)
如果你不需要第一个项目的数据了,可以删除旧的MySQL卷,重新启动服务:
# 停止并删除现有容器 docker-compose down # 删除MySQL卷 docker volume rm <你的项目目录名>_mysql # 重新启动 docker-compose up -d
注意:这个操作会彻底删除第一个项目的所有数据库数据,请谨慎使用。
内容的提问来源于stack exchange,提问作者Evanss
相关产品推荐
相关产品推荐

