我正在尝试使用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"
}
2条答案
按热度按时间cbeh67ev1#
您必须先创建一个Docker网络,例如:
然后将此网络添加到您的
docker-compose
:然后重新运行
docker-compose
并再次尝试此URL:希望它有所帮助!
kgsdhlau2#
是的,所以mysql地址需要更改为正确的服务名称。你不需要创建一个网络来访问通过同一个docker合成文件启动的服务,这只在你有多个docker合成并且你想让你的服务相互通信时才有帮助。
我认为问题是当api试图运行迁移时,mysql容器没有完全启动。所以很可能是一个计时问题。检查以下线程:Docker-compose check if mysql connection is ready