You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 18:55:18