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
相关产品推荐
相关产品推荐

