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

Docker容器中PocketBase SDK无法通过容器名访问问题排查

问题解决思路与方案

核心原因分析

fetch能正常调用说明Docker网络本身互通,SDK报错net::ERR_NAME_NOT_RESOLVED且无PocketBase日志,大概率是SDK的运行环境与配置不匹配:

  • 浏览器端无法解析Docker容器名(只有容器内的Node环境能识别),若SDK在客户端代码中运行,直接用sewing_api会导致域名解析失败。
  • 服务端运行的SDK若使用Node17+,默认IPv6优先的DNS策略可能影响容器名解析。

具体解决步骤

1. 区分SDK运行环境配置baseUrl

  • 服务端代码(Next.js Server Components、getServerSideProps、API路由):
    直接使用Docker容器名作为主机名,因为服务端容器处于Docker网络内,可正常解析:

    import PocketBase from 'pocketbase';
    
    // 假设PocketBase容器暴露的端口是8090
    const pb = new PocketBase('http://sewing_api:8090');
    
  • 客户端代码(Next.js Client Components、浏览器端):
    必须使用宿主机可访问的地址(不能用容器名),建议通过环境变量配置:

    1. 在项目根目录创建.env文件:
      NEXT_PUBLIC_PB_URL=http://你的宿主机IP:8090
      
    2. 初始化SDK时读取环境变量:
      import PocketBase from 'pocketbase';
      
      const pb = new PocketBase(process.env.NEXT_PUBLIC_PB_URL);
      

2. 调整Node DNS解析策略(针对服务端SDK)

若服务端使用Node17+,默认IPv6优先可能导致容器名解析异常,可强制IPv4优先:

  • 在docker-compose.yml的Next.js服务中修改启动命令:
    services:
      next_app:
        # 其他配置...
        command: ["node", "--dns-result-order=ipv4first", "server.js"]
    
  • 或在项目package.json的启动脚本中添加参数:
    "scripts": {
      "start": "node --dns-result-order=ipv4first server.js"
    }
    

3. 验证Docker网络互通性

确认两个容器处于同一Docker网络:

  • 执行docker inspect sewing_api查看容器所属网络名称
  • 执行docker inspect 你的Next.js容器名,检查网络名称是否与前者一致
    (Docker Compose默认会自动创建专属网络,同文件内的服务默认加入该网络,若手动修改过网络配置需排查)

4. 排查SDK请求逻辑

  • 打印SDK初始化后的baseUrl,确认配置未被篡改:
    console.log('PB Base URL:', pb.baseUrl);
    
  • 用SDK的send方法手动发送请求测试,排查是否为SDK内部逻辑问题:
    try {
      const res = await pb.send('/api/collections/你的集合名/records', { method: 'GET' });
      console.log('请求成功:', res);
    } catch (err) {
      console.error('请求失败:', err);
    }
    

内容的提问来源于stack exchange,提问作者EL MAHDI BOUZKOURA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 04:00:17