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

如何让docker-compose.yml中的API可访问?请求无响应问题求助

解决Docker Compose中Express后端无响应的问题

以下是针对你的compose.yml和无响应问题的排查与修复方案:

1. 修正expose配置错误

expose指令仅用于声明容器内部监听的端口,不是端口映射,你的写法完全错误。正确格式应为- "9042"或- 9042。另外,当你使用network_mode: "host"时,容器直接共享主机网络命名空间,expose和ports配置都是多余的——容器端口会直接暴露给主机。

2. 排查network_mode: host的兼容性问题

  • 若你在Windows或macOS的Docker Desktop环境下使用host模式,会存在兼容性限制,可能导致端口无法正常映射到主机。建议改用默认的bridge网络,通过ports配置映射端口。
  • 即使保留host模式,也要确保Express服务监听的是0.0.0.0而非127.0.0.1——后者只能在容器内部访问,主机无法请求到。

3. 检查Express服务的监听配置

你的请求地址是http://127.0.0.1/(默认80端口),但后端配置的是443端口(HTTPS),存在协议/端口不匹配问题:

  • 如果服务未配置HTTPS,应修改Express监听80端口,同时请求http://127.0.0.1/;
  • 如果服务确实用HTTPS,应请求https://127.0.0.1/,并确保服务正确配置了SSL证书。

Express代码必须监听0.0.0.0才能让外部访问:

app.listen(80, '0.0.0.0', () => {
  console.log('Server running on port 80');
});

4. 补全必要的环境变量

ENDPOINT_URL和SCYLLADB_IPS仅声明但未赋值,如果后端依赖这些变量连接数据库或配置服务,会导致服务启动失败或无法正常工作。示例赋值如下:

environment:
  - ENDPOINT_URL=http://localhost:80
  - SCYLLADB_IPS=127.0.0.1

5. 确保服务依赖与健康检查生效

如果后端需要等待数据库启动完成后再启动,需添加depends_on配合数据库的健康检查:

backend:
  # ...其他配置
  depends_on:
    database:
      condition: service_healthy

修改后的compose.yml示例(推荐使用bridge网络)

services:
  database:
    image: 'database'
    build:
      context: ./database
      dockerfile: ./Dockerfile
    healthcheck:
      test: ["CMD", "cqlsh", "-u cassandra", "-p cassandra" ,"-e describe keyspaces"]
      interval: 15s
      timeout: 10s
      retries: 10
    ports:
      - "9042:9042"

  backend:
    image: 'backend'
    build:
      context: ./src/backend
      dockerfile: ./Dockerfile
    environment:
      - ENDPOINT_URL=http://localhost:80
      - SCYLLADB_IPS=database:9042
    ports:
      - "80:80"
    depends_on:
      database:
        condition: service_healthy

内容的提问来源于stack exchange,提问作者Struan Mclean

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 09:02:19