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

如何在Docker容器中部署Apollo Sandbox并解决访问无响应问题

问题:Docker部署GraphQL应用后无法访问Apollo Sandbox

本地运行GraphQL应用完全正常,可通过浏览器正常使用Apollo Sandbox;但部署到Docker容器后,浏览器提示ERR_EMPTY_RESPONSE,且容器日志未显示任何异常信息。

docker-compose.yml 配置

version: "3"
services:

  gql:
    image: node:latest
    user: node
    working_dir: /home/node/app
    depends_on:
      - db
    networks:
      - kn-net
    environment:
      - NODE_ENV=production
    volumes:
      - ./:/home/node/app
    ports:
      - 3011:3011
    command: "npm run start:gql:lib"

  db:
    image: mongo:latest
    networks:
      - kn-net
    restart: always
    volumes:
      - ./scripts:/docker-entrypoint-initdb.d
    ports:
      - 3013:27017
    environment:
      MONGO_INITDB_ROOT_USERNAME: "root"
      MONGO_INITDB_ROOT_PASSWORD: ">7Xs,BXmvs"
      MONGO_INITDB_DATABASE: "lionmiss"

networks:
  kn-net:
    driver: bridge

应用index.ts核心代码

// 省略导入和nexus schema创建逻辑(本地运行无问题)

// DB配置连接
setMongoose("strictQuery", true);
const promiseDB: Promise<Mongoose> = connect( `mongodb://${DB_HOST}:${DB_PORT}/${DB_NAME}?authSource=${DB_NAME}`,
  {
    user: DB_USER,
    pass: DB_USER_PASS,
  }
);
console.log( `mongodb://${DB_HOST}:${DB_PORT}/${DB_NAME}?authSource=${DB_NAME}`);

// 连接DB + 初始化GraphQL API
promiseDB
  .then(() => {
    console.log(`🗂️  Connected to DB`);

    let plugins = [];
    if (process.env.NODE_ENV === 'production') {
      plugins = [ApolloServerPluginLandingPageProductionDefault({ embed: true, graphRef: 'myGraph@prod' })]
    } else {
      plugins = [ApolloServerPluginLandingPageLocalDefault({ embed: true })]
    }

    const server: ApolloServer = new ApolloServer({
      schema,
      plugins,
    });

    return startStandaloneServer(server, {context, listen: {port: Number(GQL_PORT), host: GQL_HOST}, });
  })
  .then(({url}: {url: string}) => console.log(`🚀  Graphql server is ready at ${url}`))
  .catch((err: Error) => console.log("💀  Error Grapql server:", err));

排查方向及解决方案

1. 服务绑定主机问题

Docker容器内服务若绑定localhost(即127.0.0.1),外部无法通过端口映射访问:

  • 检查GQL_HOST环境变量,若设置为localhost或127.0.0.1,改为0.0.0.0,让服务监听容器内所有网卡地址。
  • 可在docker-compose的gql服务中添加环境变量:- GQL_HOST=0.0.0.0,或确保容器环境中的GQL_HOST值为0.0.0.0。

2. 数据库连接就绪问题

depends_on仅保证db服务先启动,不保证MongoDB完全初始化完成,可能导致GraphQL服务启动时连接失败:

  • 在gql服务的command前添加等待脚本,比如使用wait-for-it:
    修改command为:command: "npx wait-for-it db:27017 -- npm run start:gql:lib"(需提前在项目中安装wait-for-it)。
  • 确认DB_HOST设置为db(docker-compose中服务名可作为内部域名),本地环境用localhost,容器内必须改为db才能连通MongoDB服务。

3. 生产环境插件配置问题

生产环境使用ApolloServerPluginLandingPageProductionDefault需正确配置graphRef,否则可能导致页面加载失败:

  • 临时将生产环境插件替换为ApolloServerPluginLandingPageLocalDefault测试,看是否能正常访问Sandbox。
  • 若需Apollo Studio集成,确保graphRef是Apollo Studio中创建的正确标识;无需集成则直接使用本地插件。

4. 端口与网络验证

  • 检查宿主机3011端口是否被占用:执行netstat -tulpn | grep 3011查看。
  • 验证容器网络连通性:进入gql容器执行ping db,确认能连通MongoDB服务。
  • 检查容器内服务监听状态:进入gql容器执行netstat -tulpn | grep 3011,确认服务确实在监听3011端口。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 21:07:35