使用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错误。
分步修复方案
修正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"验证应用数据库配置(如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 // 按需配置 } };检查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 {}重新部署容器
停止现有容器并重新构建启动:docker-compose down docker-compose --env-file=docker.env build docker-compose --env-file=docker.env up
内容的提问来源于stack exchange,提问作者Nirjal Paudel
相关产品推荐
相关产品推荐

