Docker部署SvelteKit+PocketBase应用时遇连接拒绝错误求助
Docker化SvelteKit+PocketBase应用请求失败问题解决
问题
本地运行整合PocketBase的SvelteKit应用完全正常,但Docker化后所有请求均失败,出现如下错误:
错误信息
ClientResponseError 0: 处理请求时发生错误。 2023-02-16 10:34:53 at new ClientResponseError (file:///app/node_modules/pocketbase/dist/pocketbase.es.mjs:1:2285) 2023-02-16 10:34:53 at file:///app/node_modules/pocketbase/dist/pocketbase.es.mjs:1:40471 2023-02-16 10:34:53 at processTicksAndRejections (node:internal/process/task_queues:96:5) 2023-02-16 10:34:53 at async GET (file:///app/build/server/chunks/_server.ts-49cdad99.js:4:20) 2023-02-16 10:34:53 at async render_endpoint (file:///app/build/server/index.js:1494:22) 2023-02-16 10:34:53 at async resolve (file:///app/build/server/index.js:3671:22) 2023-02-16 10:34:53 at async Object.handle (file:///app/build/server/chunks/hooks.server-8970b6b5.js:8:20) 2023-02-16 10:34:53 at async respond (file:///app/build/server/index.js:3564:22) 2023-02-16 10:34:53 at async Array.ssr (file:///app/build/handler.js:1190:3) { 2023-02-16 10:34:53 url: '', 2023-02-16 10:34:53 status: 0, 2023-02-16 10:34:53 data: {}, 2023-02-16 10:34:53 isAbort: false, 2023-02-16 10:34:53 originalError: TypeError: fetch 请求失败 2023-02-16 10:34:53 at fetch (file:///app/build/shims.js:20696:14) 2023-02-16 10:34:53 at processTicksAndRejections (node:internal/process/task_queues:96:5) 2023-02-16 10:34:53 at async GET (file:///app/build/server/chunks/_server.ts-49cdad99.js:4:20) 2023-02-16 10:34:53 at async render_endpoint (file:///app/build/server/index.js:1494:22) 2023-02-16 10:34:53 at async resolve (file:///app/build/server/index.js:3671:22) 2023-02-16 10:34:53 at async Object.handle (file:///app/build/server/chunks/hooks.server-8970b6b5.js:8:20) 2023-02-16 10:34:53 at async respond (file:///app/build/server/index.js:3564:22) 2023-02-16 10:34:53 at async Array.ssr (file:///app/build/handler.js:1190:3) { 2023-02-16 10:34:53 cause: Error: 连接被拒绝 ECONNREFUSED 127.0.0.1:8090 2023-02-16 10:34:53 at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1278:16) { 2023-02-16 10:34:53 errno: -111, 2023-02-16 10:34:53 code: 'ECONNREFUSED', 2023-02-16 10:34:53 syscall: 'connect', 2023-02-16 10:34:53 address: '127.0.0.1', 2023-02-16 10:34:53 port: 8090 2023-02-16 10:34:53 } 2023-02-16 10:34:53 } 2023-02-16 10:34:53 }
核心原因
错误里的ECONNREFUSED 127.0.0.1:8090是关键:在Docker容器内部,127.0.0.1指向容器自身,而非宿主机或PocketBase容器。你的SvelteKit应用仍在尝试访问本地环回地址,但在Docker网络环境中,这个地址无法找到PocketBase服务。
解决步骤
1. 确保容器处于同一Docker网络
如果使用docker-compose,默认会自动创建专属网络,只需将SvelteKit和PocketBase放在同一个docker-compose.yml文件中即可。若手动创建容器,需显式指定加入同一网络:
# 创建共享网络 docker network create pb-svelte-network # 启动PocketBase并加入网络 docker run --network pb-svelte-network -p 8090:8090 ... pocketbase/pocketbase:latest # 启动SvelteKit并加入同一网络 docker run --network pb-svelte-network -p 3000:3000 ... your-sveltekit-image
2. 修改PocketBase访问地址为服务名
在SvelteKit代码中,将PocketBase的初始化地址从http://127.0.0.1:8090替换为Docker服务名(例如docker-compose中PocketBase服务的名称,假设为pocketbase):
import PocketBase from 'pocketbase'; // 替换为服务名地址 const pb = new PocketBase('http://pocketbase:8090');
3. 配置容器启动顺序与端口
使用docker-compose时,通过depends_on确保PocketBase先于SvelteKit启动,同时确认端口暴露正确:
services: pocketbase: image: pocketbase/pocketbase:latest ports: - "8090:8090" volumes: - ./pb_data:/pb_data sveltekit: build: . ports: - "3000:3000" depends_on: - pocketbase environment: - VITE_PB_URL=http://pocketbase:8090
4. 用环境变量适配多环境
建议通过环境变量管理PocketBase地址,实现本地与Docker环境无缝切换:
- 本地开发时,设置环境变量
VITE_PB_URL=http://127.0.0.1:8090 - Docker环境中,设置为
VITE_PB_URL=http://pocketbase:8090
在SvelteKit中读取环境变量:
const pbUrl = import.meta.env.VITE_PB_URL || 'http://127.0.0.1:8090'; const pb = new PocketBase(pbUrl);
内容的提问来源于stack exchange,提问作者Wings
相关产品推荐
相关产品推荐

