首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Prisma不会连接到MySQL码头集装箱

Prisma不会连接到MySQL码头集装箱
EN

Stack Overflow用户
提问于 2022-11-18 04:08:56
回答 2查看 53关注 0票数 0

我试图使用Docker运行一个带有两个Docker容器( MySQL和NodeJS )的项目。我很难从后端容器连接到SQL容器。我的后端容器使用Prisma作为ORM,并在运行npx prisma migrate dev时向我显示了以下错误(在对接-组合过程中)。

代码语言:javascript
运行
复制
Error: P1001: Can't reach database server at `mysql`:`3306`
Please make sure your database server is running at `mysql`:`3306`.

经过一些研究,我认为问题是我的数据库网址。主机名应该与db容器名称相匹配(在本例中是mysql),因此我更新了该名称,但仍然没有结果。

代码语言:javascript
运行
复制
DATABASE_URL=mysql://root:root@mysql:3306/myshowlist # .env file

我也尝试了容器服务名称(db),但也不是这样。

代码语言:javascript
运行
复制
DATABASE_URL=mysql://root:root@db:3306/myshowlist # .env file

我发现令人费解的是,当MySQL容器不在容器内运行时,Prisma没有问题连接到它。当我单独启动MySQL容器并运行Prisma迁移命令时,它可以工作,我可以像普通一样使用后端服务,并从数据库中保存/读取。不过,我必须使用localhost作为主机名,这是有意义的。

我不知道会有什么问题,我真的很希望能朝正确的方向前进!

docker-compose.yml:

代码语言:javascript
运行
复制
version: "3.8"
services:
    api:
        build:
            context: ./api-old
        ports:
            - "5001:3200"
        container_name: api
        depends_on:
            - db
    
    db:
        image: mysql:5.7
        restart: always
        container_name: mysql
        ports:
            - "3306:3306"
        environment:
          MYSQL_DATABASE: myshowlist
          MYSQL_ROOT_PASSWORD: "root"

./api-old/Dockerfile:

代码语言:javascript
运行
复制
FROM node:latest

WORKDIR /usr/src/app

COPY package*.json ./
COPY .env ./
COPY prisma ./prisma/

RUN npm ci
RUN npm run db-prod

COPY . .

EXPOSE 5001

CMD ["npm", "start"]

schema.prisma:

代码语言:javascript
运行
复制
datasource db {
    provider        = "mysql"
    url             = env("DATABASE_URL")
}

generator client {
    provider        = "prisma-client-js"
}
EN

回答 2

Stack Overflow用户

发布于 2022-11-18 04:18:09

您必须首先创建一个码头网络,例如:

代码语言:javascript
运行
复制
docker network create demo-network

然后将这个网络添加到您的docker-compose

代码语言:javascript
运行
复制
version: "3.8"
services:
  api:
    build:
      context: ./api-old
    ports:
      - "5001:3200"
    container_name: api
    depends_on:
      - db
    networks:
      - demo-network

  db:
    image: mysql:5.7
    restart: always
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: myshowlist
      MYSQL_ROOT_PASSWORD: "root"
    networks:
      - demo-network
networks:
  demo-network:
    external: true

然后重新运行docker-compose并再次尝试这个url:

代码语言:javascript
运行
复制
DATABASE_URL=mysql://root:root@mysql:3306/myshowlist

希望能帮上忙!

票数 0
EN

Stack Overflow用户

发布于 2022-11-18 04:34:37

是的,因此mysql地址需要更改为正确的服务名称。您不需要创建一个网络来访问通过同一个docker文件启动的服务,只有当您有多个对接者组合并且您希望您的服务能够相互通信时,这才有帮助。

我认为问题在于,当api试图运行迁移时,mysql容器还没有完全启动。所以时间问题很可能是。检查这个线程:Docker-compose check if mysql connection is ready

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74484839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档