M1芯片Docker环境中Prisma无法连接PostgreSQL数据库问题求助
核心问题
核心问题分为两类:一是容器内访问数据库的地址配置错误,二是Postgres镜像未适配Apple Silicon架构导致的网络连通异常。Postgres日志中的relation "_prisma_migrations" does not exist属于首次迁移前的正常提示,不是故障原因,首次迁移成功后会自动创建该表,报错会消失。
解决方案
- 修正容器内的数据库连接地址
你当前的DATABASE_URL配置仅适用于宿主机器访问Postgres服务,当通过docker-compose run在next容器内执行Prisma命令时,next容器与Postgres容器同属Docker Compose默认网络,需要通过Postgres的服务名或容器名访问内部端口,而不是宿主的localhost:15432。
修改.env文件中的DATABASE_URL为以下任意一种即可:# 用docker-compose中postgres的服务名访问 DATABASE_URL="postgres://postgres:postgres@postgres:5432/postgres" # 或者用你定义的容器名访问 DATABASE_URL="postgres://postgres:postgres@test-postgres:5432/postgres"
如果需要同时支持宿主本地开发和容器内运行,可以在docker-compose的next服务配置中添加environment字段,单独覆盖容器内的数据库连接地址。
- 更换原生支持ARM架构的Postgres镜像
Postgres 13的早期版本没有官方arm64构建,在M1芯片上通过QEMU转译运行时会随机出现网络连通异常,建议升级到原生支持Apple Silicon的版本:
修改docker-compose.yml中Postgres的镜像配置:postgres: container_name: 'test-postgres' restart: unless-stopped image: 'postgres:15' ports: - '15432:5432' volumes: - 'pgdata:/var/lib/postgresql/data/' environment: POSTGRES_PASSWORD: postgres
更换镜像前注意备份pgdata卷中的数据,避免数据丢失。
- 补充Prisma ARM架构二进制目标
在schema.prisma的generator配置中添加arm64架构的二进制目标,适配Linux ARM容器环境:generator client { provider = "prisma-client-js" binaryTargets = ["native", "debian-openssl-1.1.x", "linux-arm64-openssl-1.1.x", "linux-musl"] previewFeatures = ["orderByRelation", "selectRelationCount"] }
修改后重新生成Prisma客户端:npx prisma generate。
- 验证配置
修改完成后重启所有容器:docker-compose down && docker-compose up -d
再执行迁移命令验证:
docker-compose run --publish 5555:5555 next npx prisma migrate dev
内容的提问来源于stack exchange,提问作者brstkr
相关产品推荐
相关产品推荐

