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

使用Docker Compose部署NestJS+PostGIS+Redis时遇连接拒绝问题

NestJS GraphQL应用Docker部署后出现ECONNREFUSED连接错误

执行docker-compose --env-file=docker.env up启动容器后,基于NestJS的GraphQL应用始终抛出connection refused(ECONNREFUSED)错误,应用采用PostGIS作为数据库、Redis作为队列和缓存机制。

相关配置文件

构建命令

docker-compose --env-file=docker.env up

Docker Compose文件

version: '3.7'
services:
  cleanilo-admin-project:
    image: cleanilo-admin-project
    build: .
    command: npm run start:prod
    ports:
      - '3001:80'
    env_file: docker.env
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    networks:
      - cleanilo-docker-network

  redis:
    image: 'redis:alpine'
    ports:
      - '6379:6379'
    env_file: docker.env
    healthcheck:
      test: ['CMD-SHELL', 'redis-cli ping | grep PONG']
      interval: 1s
      timeout: 3s
      retries: 5

  postgres:
    image: postgis/postgis:12-3.3-alpine
    ports:
      - '5432:5432'
    env_file: docker.env
    networks:
      - cleanilo-docker-network
    healthcheck:
      test: 'pg_isready --username=$POSTGRES_USER && psql --username=$POSTGRES_USER --list'
      interval: 20s
      timeout: 10s
      retries: 5
      start_period: 30s
    restart: on-failure

networks:
  cleanilo-docker-network:
    name: cleanilo-docker-network

Dockerfile

FROM node:18-slim
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
COPY --chown=node:node package*.json ./
USER node
RUN npm install --force  --legacy-peer-deps --no-cache
COPY --chown=node:node . . 
COPY docker.env .env
EXPOSE 3001
RUN npm run build

docker.env环境变量文件

# POSTGRES DOCKER ENV
POSTGRES_PASSWORD="9&G*3Y9asZ"
POSTGRES_USER="postgres"
POSTGRES_DB="database"

#DATABASE
DATABASE_HOST="postgres"
DATABASE_USER="postgres"
DATABASE_PASSWORD="9&G*3Y9asZ"
DATABASE_NAME="database"
DATABASE_HOST="5432"

错误分析与解决方案

核心问题定位

从docker.env文件可以看到重复定义了DATABASE_HOST:先是将其设为PostgreSQL容器的服务名postgres,随后又覆盖为5432(数据库端口)。这会导致应用尝试连接主机名为5432的数据库,完全无法找到目标服务,直接触发ECONNREFUSED错误。

分步修复方案

  1. 修正docker.env变量
    删除重复的DATABASE_HOST="5432",新增DATABASE_PORT="5432",确保数据库主机指向正确的容器服务名,端口单独配置:

    # POSTGRES DOCKER ENV
    POSTGRES_PASSWORD="9&G*3Y9asZ"
    POSTGRES_USER="postgres"
    POSTGRES_DB="database"
    
    #DATABASE
    DATABASE_HOST="postgres"
    DATABASE_USER="postgres"
    DATABASE_PASSWORD="9&G*3Y9asZ"
    DATABASE_NAME="database"
    DATABASE_PORT="5432"
    
  2. 验证应用数据库配置(如ormconfig.ts)
    确保配置文件正确读取环境变量,使用DATABASE_HOST(容器服务名)和DATABASE_PORT:

    export default {
      type: 'postgres',
      host: process.env.DATABASE_HOST,
      port: parseInt(process.env.DATABASE_PORT, 10),
      username: process.env.DATABASE_USER,
      password: process.env.DATABASE_PASSWORD,
      database: process.env.DATABASE_NAME,
      entities: ['dist/**/*.entity{.ts,.js}'],
      synchronize: true, // 根据实际场景调整
      extra: {
        ssl: false // 按需配置
      }
    };
    
  3. 检查Redis连接配置
    确认应用中Redis的连接主机使用容器服务名redis,而非localhost:

    // app.module.ts示例配置
    import { RedisModule } from '@nestjs-modules/ioredis';
    
    @Module({
      imports: [
        RedisModule.forRoot({
          host: process.env.REDIS_HOST || 'redis',
          port: parseInt(process.env.REDIS_PORT || '6379', 10),
        }),
        // 其他模块
      ],
    })
    export class AppModule {}
    
  4. 重新部署容器
    停止现有容器并重新构建启动:

    docker-compose down
    docker-compose --env-file=docker.env build
    docker-compose --env-file=docker.env up
    

内容的提问来源于stack exchange,提问作者Nirjal Paudel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:17:44