Docker/Prisma - 错误:P1001:无法到达 `localhost`:`3310` 处的数据库服务器

问题描述 投票:0回答:1

.dev.env

DATABASE_URL=mysql://root:root@localhost:3310/masterapp_mysql_db_dev?schema=public

docker-compose.yaml

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

Dockerfile


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"]

package.json

"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),还是这样遇到同样的错误。

mysql node.js docker prisma
1个回答
0
投票

看到很多关于这个问题的帖子。您的问题现在可能已经解决,但对于将来遇到此问题的任何人来说,这是一个潜在的解决方案:

如果您在构建步骤中运行 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”)。

© www.soinside.com 2019 - 2024. All rights reserved.