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

Nuxt 3在Docker及Docker Compose中出现500 fetch failed错误求助

Nuxt 3 Docker容器化后500 fetch failed问题排查

问题背景

本地运行正常的Nuxt 3应用,在Docker容器化(pnpm monorepo架构)后出现500 fetch failed错误,无日志输出,使用node --trace-warnings也未捕获到错误。已尝试将frontend服务的环境变量SERVER_URL设置为backend容器名backend:3001/graphql,但问题依旧。

项目目录结构:

apps
│
├── backend
│   ├── Dockerfile
│   └── package.json
│
├── frontend
│   ├── Dockerfile
|   ├── nuxt.config.ts
│   └── package.json
│
├── docker-compose.yaml
├── package.json
├── pnpm-lock.yaml
└── pnpm-workspace.yaml

相关配置文件见用户提供的apps/frontend/Dockerfile、docker-compose.yaml、nuxt.config.ts。

排查修复步骤

1. 确保环境变量在运行时正确注入

Nuxt 3的配置在构建阶段可能会固化环境变量,导致运行时无法更新。需调整配置,让Apollo的端点支持运行时动态获取:

  • 修改nuxt.config.ts,使用运行时配置区分服务端/客户端请求:
    export default defineNuxtConfig({
        devtools: { enabled: true },
        modules: [
            "@nuxtjs/apollo",
            "@nuxtjs/tailwindcss",
            "@nuxtjs/color-mode",
            "@nuxt/icon",
            "@element-plus/nuxt",
            "@nuxt/image",
        ],
        plugins: [{ src: "~/plugins/vue-toastification.ts", mode: "client" }],
        // 添加运行时配置
        runtimeConfig: {
            public: {
                // 客户端浏览器使用的端点(映射主机端口)
                clientApolloEndpoint: process.env.CLIENT_SERVER_URL ?? "http://127.0.0.1:3001/graphql"
            },
            // 服务端渲染时使用的端点(Docker内部服务名)
            serverApolloEndpoint: process.env.SERVER_URL ?? "http://backend:3001/graphql"
        },
        apollo: {
            clients: {
                default: {
                    // 根据请求来源动态切换端点
                    httpEndpoint: process.server 
                        ? process.env.SERVER_URL ?? "http://backend:3001/graphql"
                        : process.env.CLIENT_SERVER_URL ?? "http://127.0.0.1:3001/graphql",
                    inMemoryCacheOptions: {
                        addTypename: false,
                    },
                    defaultOptions: {
                        watchQuery: {
                            fetchPolicy: "no-cache",
                        },
                        query: {
                            fetchPolicy: "no-cache",
                        },
                    },
                },
            },
        },
        css: ["@fontsource-variable/inter/index.css"],
    });
    
  • 更新docker-compose.yaml的frontend环境变量:
    services:
      frontend:
        container_name: frontend
        build:
          context: .
          dockerfile: apps/frontend/Dockerfile
        ports:
          - '3000:3000'
        networks:
          - mynetwork
        depends_on:
          - backend
        environment:
          - SERVER_URL=http://backend:3001/graphql
          - CLIENT_SERVER_URL=http://localhost:3001/graphql
    
      # ...其他服务配置
    

2. 解决服务启动顺序与就绪问题

depends_on仅保证容器启动顺序,不保证backend服务完全就绪(如数据库连接完成)。添加健康检查确保frontend在backend服务可用后再启动:

  • 在docker-compose.yaml的backend服务中添加健康检查:
    backend:
      container_name: backend
      build:
        context: .
        dockerfile: apps/backend/Dockerfile
      ports:
        - '3001:3001'
      depends_on:
        - db
      networks:
        - mynetwork
      environment:
        - POSTGRES_HOST=postgres
        - POSTGRES_PORT=5432
        - POSTGRES_USERNAME=postgres
        - POSTGRES_PASSWORD=password
        - POSTGRES_DATABASE=database
        - SERVER_ADDRESS=0.0.0.0
        - SERVER_PORT=3001
      # 添加健康检查
      healthcheck:
        test: ["CMD", "curl", "-f", "http://localhost:3001/graphql"]
        interval: 5s
        timeout: 5s
        retries: 5
    
  • 修改frontend的depends_on为等待backend健康:
    frontend:
      # ...其他配置
      depends_on:
        backend:
          condition: service_healthy
    

3. 开启详细日志排查

通过环境变量开启Nuxt/Nitro的详细日志,便于定位错误:

  • 更新frontend的环境变量:
    frontend:
      environment:
        - SERVER_URL=http://backend:3001/graphql
        - CLIENT_SERVER_URL=http://localhost:3001/graphql
        - NODE_ENV=production
        - NITRO_LOG_LEVEL=trace
        - NUXT_LOG_LEVEL=trace
    
  • 查看容器日志:
    docker logs frontend
    

4. 验证容器网络连通性

进入frontend容器,测试与backend的网络连通性:

# 进入frontend容器
docker exec -it frontend ash

# 测试DNS解析是否正常
ping backend

# 测试backend服务是否可达
curl http://backend:3001/graphql
  • 如果ping不通,检查Docker网络配置是否正确;如果curl返回错误,确认backend服务是否正常监听0.0.0.0:3001(当前backend的SERVER_ADDRESS=0.0.0.0配置正确)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:38:11