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

Docker化NodeJS应用连接Strapi时出现ECONNREFUSED错误的排查

问题:Docker Compose同网络下NodeJS容器请求Strapi容器出现ECONNREFUSED错误

错误日志:

ERROR [ExceptionsHandler] request to http://strapi:1377/api/login-page failed, reason: connect ECONNREFUSED 172.19.0.7:1377

相关代码与配置

请求代码(TypeScript)

export class GetLabelsService {
    async getRouteLabels(labelPath: string) {
        const request = `http://strapi:1377${labelPath}`;
        console.log(request)
        const res = await fetch(request);
        const labels_data = await res.json();
        return labels_data
    }
}

docker-compose.yml 配置

version: "3.8"
services:
  api:
    build:
      context: .
      dockerfile: Dockerfile-api
    environment:
      DB_TYPE: ${DB_TYPE}
      DB_HOST: ${DB_HOST}
      DB_PORT: ${DB_PORT}
      DB_USERNAME: ${DB_USERNAME}
      DB_PASSWORD: ${DB_PASSWORD}
      DB_DATABASE: ${DB_DATABASE}
      APP_HOST: ${APP_HOST}
      JWT_SECRET: ${JWT_SECRET}
      JWT_EXIPRY_TIME: ${JWT_EXIPRY_TIME}
      STRIPE_PUBLISH_KEY: ${STRIPE_PUBLISH_KEY}
      STRIPE_SECRET_KEY: ${STRIPE_SECRET_KEY}
      currency: ${currency}
      FCM_DATABASE_URL: ${FCM_DATABASE_URL}
      SMTP_HOST: ${SMTP_HOST}
      SMTP_USERNAME: ${SMTP_USERNAME}
      SMTP_PASSWORD: ${SMTP_PASSWORD}
    ports:
      - 4000:4000
    networks:
      - app-network

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin_container
    restart: always
    environment:
      PMA_HOST: ${DB_HOST}
      PMA_USER: ${DB_USERNAME}
      PMA_PASSWORD: ${DB_PASSWORD}
      UPLOAD_LIMIT: 64M
    ports:
      - "8080:80"
    networks:
      - app-network
      
  strapi:
    build:
      context: ./cms
      dockerfile: Dockerfile-cms
    environment:
      DATABASE_CLIENT: ${DATABASE_CLIENT}
      DATABASE_HOST: ${DATABASE_HOST}
      DATABASE_PORT: ${DATABASE_PORT}
      DATABASE_NAME: ${DATABASE_NAME}
      DATABASE_USERNAME: ${DATABASE_USERNAME}
      DATABASE_PASSWORD: ${DATABASE_PASSWORD}
      APP_KEYS: ${APP_KEYS}
      API_TOKEN_SALT: ${API_TOKEN_SALT}
      ADMIN_JWT_SECRET: ${ADMIN_JWT_SECRET}
      JWT_SECRET: ${JWT_SECRET}
      NODE_ENV: ${NODE_ENV}
      MASTER_KEY: ${MASTER_KEY}
      MEILI_HOST: http://meilisearch:7700
      CLOUDINARY_KEY: ${CLOUDINARY_KEY}
      CLOUDINARY_NAME: ${CLOUDINARY_NAME}
      CLOUDINARY_SECRET: ${CLOUDINARY_SECRET}
    volumes:
      - ./cms/config:/srv/app/config
      - ./cms/src:/srv/app/src
      - ./cms/package.json:/srv/package.json
      - ./cms/yarn.lock:/srv/yarn.lock
      - ./cms/datadump:/srv/app/datadump
      - ./cms/public:/srv/app/public
    ports:
      - 1337:1337
    depends_on:
      - postgres
    networks:
      - app-network
    command: yarn develop

  meilisearch:
    image: getmeili/meilisearch:latest
    environment:
      MEILI_MASTER_KEY: ${MASTER_KEY}
    ports:
      - 7700:7700
    networks:
      - app-network
    volumes:
      - ./data:/srv/app/data
      
  pgadmin:
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL}
      PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD}
    ports:
      - 8088:80
    depends_on:
      - postgres
    networks:
      - app-network
      
  # Back-end services 
  postgres:
    image: postgres:12
    environment:
      POSTGRES_USER: ${DATABASE_USERNAME}
      POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
      POSTGRES_DB: ${DATABASE_NAME}
    volumes:
      - pgdata:/var/lib/postgresql/data
    ports:
      - 5432:5432
    networks:
      - app-network

volumes:
  db_data:
  pgdata:

networks:
  app-network:
    driver: bridge

Dockerfile-api

# Dockerfile
FROM node:16-alpine

# create destination directory
RUN mkdir -p /usr/src/api
WORKDIR /usr/src/api

# update and install dependency
RUN apk update && apk upgrade

# copy the app, note .dockerignore
COPY . /usr/src/api/

RUN yarn
RUN yarn build

EXPOSE 3000

CMD [ "yarn", "start:dev" ]

错误原因分析与解决方案

1. 请求端口错误

从配置可以看到,Strapi容器内部服务运行在1337端口(ports: -1337:1337),但请求代码中错误使用了1377端口,这是直接导致连接失败的原因。

解决方法:修正请求URL的端口为1337:

const request = `http://strapi:1337${labelPath}`;

2. Strapi服务未完全就绪(容器启动顺序问题)

depends_on: -postgres仅保证PostgreSQL容器先启动,但不会等待Strapi服务完成初始化。如果NodeJS的api容器先启动并发起请求,此时Strapi可能还在加载数据库或初始化服务,会触发连接拒绝。

解决方法:

  • 为Strapi服务添加健康检查,确保服务就绪后再允许api容器启动:
    在docker-compose.yml的strapi服务中添加:
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:1337/api"]
      interval: 10s
      timeout: 5s
      retries: 5
    
  • 修改api服务的depends_on,依赖Strapi的健康状态:
    api:
      # ...其他配置
      depends_on:
        strapi:
          condition: service_healthy
    

3. Strapi监听地址限制

如果Strapi配置为仅监听localhost,容器内部的其他服务无法访问它——因为localhost在容器内指向自身回环地址,而非容器网络的IP。

解决方法:
确认Strapi的配置文件(./cms/config/server.js)中host设置为0.0.0.0:

module.exports = ({ env }) => ({
  host: env('HOST', '0.0.0.0'),
  port: env.int('PORT', 1337),
  // ...其他配置
});

内容的提问来源于stack exchange,提问作者George Marwanqana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:17:01