DATABASE_URL=mysql://root:root@localhost:3310/masterapp_mysql_db_dev?schema=public
version: "3.9"
services:
masterapp-dev-db:
image: mysql:latest
container_name: masterapp_db
ports:
- 3310:3310
expose:
- 3310
volumes:
- /var/lib/mysql:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: masterapp_mysql_db_dev
MYSQL_USER: test_user
MYSQL_PASSWORD: test_pass
MYSQL_ROOT_HOST: '%'
MYSQL_TCP_PORT: 3310
server-dev:
build: ./server
volumes:
- /server/home/node/server
env_file:
- ./server/src/config/envConfig/.dev.env
ports:
- "8080:8080"
links:
- masterapp-dev-db
depends_on:
- masterapp-dev-db
FROM node:19-alpine3.15
WORKDIR /server
COPY package*.json ./
RUN npm i
COPY . ./
EXPOSE 8080
RUN npm run migrate:mysql:dev
RUN npx prisma generate
CMD ["npm", "run", "dev"]
"migrate:mysql:dev": "dotenv -e ./src/config/envConfig/.dev.env -- npx prisma migrate dev --name migrate-msql",
"db:dev:rm": "docker compose rm masterapp-dev-db -s -f -v",
"db:dev:up": "docker compose up masterapp-dev-db -d",
"db:dev:restart": "npm run db:dev:rm && npm run db:dev:up && sleep 1 && npm run migrate:mysql:dev",
"dev": "ts-node-dev --files --respawn --transpile-only src/app.ts"
首先我运行
docker compose up masterapp-dev-db -d
,它会启动我的 mysql 数据库的容器。此时,数据库工作正常,并且可以使用 docker-compose 文件中列出的环境凭据在本地主机上访问。
然后我运行了
docker compose up server-dev -d
,这给我带来了上述错误。
我尝试将 localhost 更改为服务名称(masterapp-dev-db)、容器名称(masterapp_db)、容器的IP(172.19.0.2),还是这样遇到同样的错误。
看到很多关于这个问题的帖子。您的问题现在可能已经解决,但对于将来遇到此问题的任何人来说,这是一个潜在的解决方案:
如果您在构建步骤中运行 prisma migrate,则您的容器尚未连接到运行数据库的 compose/docker 网络。联网发生在运行时。因此,迁移必须通过 Dockerfile 在容器启动时使用的 CMD 来完成。
解决方法:
在 package.json 中创建自定义脚本:
'''
“脚本”:{
...其他脚本
“容器启动”:“npx prisma migrate dev --schema=/app/prisma/schema.prisma && npm run dev
}
'''
确保 --schema 标志指向容器 WORKDIR 中的 prisma.schema。 Dockerfile 示例:
'''
来自节点:高山
工作目录/应用程序
复制 package.json /app/package.json
运行 npm 安装
复制。 .
运行 npx prisma 生成
暴露8080
CMD [“npm”,“运行”,“容器启动”]
'''
如果与 s 中的 sqlDB 架构相比,您的 prisma.schema 没有进行任何更改,则在运行自定义脚本的迁移部分时不会进行任何更改。
但是请记住,对 prisma.schema 的某些更改将在迁移时清除数据库中的所有数据,并且需要在终端中进行交互来确认清除(例如,将列约束更改为“not null”)。