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、浏览器端):
必须使用宿主机可访问的地址(不能用容器名),建议通过环境变量配置:- 在项目根目录创建
.env文件:NEXT_PUBLIC_PB_URL=http://你的宿主机IP:8090 - 初始化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
相关产品推荐
相关产品推荐

