Prisma无法连接到MySQL Docker容器

cidc1ykv  于 2022-11-21  发布在  Mysql
关注(0)|答案(2)|浏览(204)

我正在尝试使用docker-compose来运行一个包含两个Docker容器MySQL和NodeJS的项目。我在从后端容器连接到SQL容器时遇到了问题。我的后端容器使用Prisma作为它的ORM,并在运行npx prisma migrate dev时(在docker-compose期间)显示了以下错误。

Error: P1001: Can't reach database server at `mysql`:`3306`
Please make sure your database server is running at `mysql`:`3306`.

经过一番研究,我认为问题出在我的数据库URL上。主机名应该与DB容器名称匹配(本例中为MySQL),所以我更新了它,但仍然没有运气。

DATABASE_URL=mysql://root:root@mysql:3306/myshowlist # .env file

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

DATABASE_URL=mysql://root:root@db:3306/myshowlist # .env file

令我感到困惑的是,当我的Prisma不在容器内运行时,它连接到MySQL容器没有问题。当我单独启动MySQL容器并运行Prisma migrate命令时,它工作正常,我可以像正常一样使用后端服务并从数据库中保存/读取。我必须使用localhost作为主机名,这是有意义的。
我不知道是什么问题,我真的很感激在正确的方向推动!
docker-compose.yml:

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/停靠文件:

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:

datasource db {
    provider        = "mysql"
    url             = env("DATABASE_URL")
}

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

cbeh67ev1#

您必须先创建一个Docker网络,例如:

docker network create demo-network

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

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:

DATABASE_URL=mysql://root:root@mysql:3306/myshowlist

希望它有所帮助!

kgsdhlau

kgsdhlau2#

是的,所以mysql地址需要更改为正确的服务名称。你不需要创建一个网络来访问通过同一个docker合成文件启动的服务,这只在你有多个docker合成并且你想让你的服务相互通信时才有帮助。
我认为问题是当api试图运行迁移时,mysql容器没有完全启动。所以很可能是一个计时问题。检查以下线程:Docker-compose check if mysql connection is ready

相关问题