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

