Docker环境下Next.js调用Strapi API出现ECONNREFUSED错误求助
解决方案
问题根源
Docker容器里的localhost指向容器自身,而非宿主机或其他容器。你在Next.js中请求http://localhost:1337,实际是在前端容器内部访问1337端口,而Strapi后端运行在独立的容器中,因此会触发连接拒绝错误。
1. 修改API请求地址
把Next.js代码里的请求地址从localhost:1337替换为Docker Compose中后端服务的名称backend:1337(Docker会自动将服务名解析为对应容器的IP):
export async function getStaticProps() { const res = await fetch('http://backend:1337/api/posts') const data = await res.json() return { props: { data }, } }
2. 确保Strapi监听所有网络接口
默认情况下Strapi可能只监听127.0.0.1,导致其他容器无法访问。需要修改Strapi配置,让它绑定到0.0.0.0:
- 在Strapi的
.env文件中添加:
HOST=0.0.0.0 PORT=1337
- 或者修改
config/server.js(或config/server.ts):
module.exports = ({ env }) => ({ host: env('HOST', '0.0.0.0'), port: env.int('PORT', 1337), app: { keys: env.array('APP_KEYS'), }, });
3. 处理容器启动顺序(可选但推荐)
depends_on仅保证后端容器先启动,不保证Strapi服务完全就绪。可以给后端添加健康检查,确保服务可用后再启动前端:
修改docker-compose.yml:
version: '3.8' services: backend: container_name: backend build: context: backend dockerfile: .docker/dev.dockerfile image: backend:latest env_file: ./backend/.env volumes: - strapi_data:/usr/local/backend/strapi/.tmp - strapi_upload:/usr/local/backend/strapi/public/uploads ports: - '1337:1337' # 添加健康检查 healthcheck: test: ["CMD", "curl", "-f", "http://localhost:1337/_health"] interval: 10s timeout: 5s retries: 5 frontend: container_name: frontend build: context: frontend dockerfile: .docker/dev.dockerfile image: frontend:latest env_file: ./frontend/.env volumes: - node_modules_next:/usr/local/frontend/node_modules - next_folder:/usr/local/frontend ports: - '3000:3000' depends_on: # 等待后端健康检查通过 backend: condition: service_healthy volumes: node_modules_next: next_folder: strapi_data: strapi_upload:
4. 验证CORS配置
你的CORS配置已经允许所有源,开发环境下无需调整。如果后续生产部署,建议将origin设置为具体的前端域名(比如https://your-frontend-domain.com)以提升安全性。
内容的提问来源于stack exchange,提问作者ZackChim
相关产品推荐
相关产品推荐

