使用Docker Compose时Knex连接字符串无法连接PostgreSQL
问题描述
我是Docker和Knex的新手,尝试通过Knex连接字符串连接Docker部署的PostgreSQL,但出现如下错误。我多次修改数据库环境变量,却仍然遇到相同错误,请问问题出在哪里?

knexfile
module.exports = { client: "pg", connection: "postgresql://postgres:postgres@localhost:5432/apps", migrations: { directory: "./migrations", tableName: "knex_migraation_apps" }, }
docker-compose.yml:
version: "3.9" volumes: apps-data: services: apps: build: . depends_on: - postgres ports: - "3001:3001" environment: - "APPS_PORT=3001" postgres: image: postgres:14.1-alpine environment: - "POSTGRES_DB=apps" ports: - "5432:5432" volumes: - apps-data:/var/lib/pgsql/data pgadmin-compose: image: dpage/pgadmin4 environment: PGADMIN_DEFAULT_EMAIL: "placeholder@example.com" PGADMIN_DEFAULT_PASSWORD: "fakepassword123!" ports: - "16543:80" depends_on: - postgres
解决方案
你的问题出在三个核心点上,逐一修正即可解决:
1. 容器内访问PostgreSQL不能用localhost
在Docker Compose的默认网络中,apps容器里的localhost指向容器自身,而非宿主机的PostgreSQL服务。要连接postgres容器,直接用服务名postgres作为主机地址:
修改knexfile的连接字符串:
connection: "postgresql://postgres:postgres@postgres:5432/apps",
2. PostgreSQL容器缺少账号密码配置
你的Knex连接用了postgres:postgres作为账号密码,但postgres容器未设置对应的环境变量,会导致认证失败。给postgres服务添加以下环境变量:
postgres: image: postgres:14.1-alpine environment: - "POSTGRES_DB=apps" - "POSTGRES_USER=postgres" - "POSTGRES_PASSWORD=postgres" ports: - "5432:5432" volumes: - apps-data:/var/lib/postgresql/data
3. PostgreSQL数据目录路径错误
PostgreSQL 14 Alpine镜像的默认数据目录是/var/lib/postgresql/data,你写的/var/lib/pgsql/data是错误路径,会导致postgres容器启动失败。将volumes里的路径修正为正确值(如上代码块所示)。
最后验证
修改完成后,执行docker-compose down彻底停止服务,再执行docker-compose up --build重新构建启动,Knex即可正常连接PostgreSQL。
内容的提问来源于stack exchange,提问作者GTemp
相关产品推荐
相关产品推荐

