我在Windows上使用Docker桌面应用程序. 在Ubuntu WSL2中,我有一个停靠容器,其中运行着一个Meteor/NodeJS服务器. 从WSL内部通过Docker-Compose启动.
docker-compose.yaml
...
environment:
- ROOT_URL=http://localhost:8080
- PORT=8080
ports:
- "8080:8080"
调用服务器上的Meteor-Files,它将执行以下请求:
return new Promise((resolve, reject) => {
UserFiles.load(url, options,
(loadError, fileRef) => {
if (loadError) {
return reject(loadError);
} else {
return resolve(fileRef);
}
}, true);
});
}
现在,停靠容器中的应用程序必须访问其自身的一个HTTP端点,如http://127.0.0.1:8080/api
当我从outside调用docker中的this端点时,我得到了正确的结果.
当我使用终端连接到 docker 容器并curl 端点时,我得到了正确的结果.
Update:在真正的Linux机器上运行Docker,而不是在Windows上运行WSL2 Ubuntu时,它也能正常工作.
但是,当在容器中运行的应用程序/服务try 使用相同的URL通过相同的端点调用自己时,我得到了一个ECONNREFUSED - CONNECTION REFUSED
错误.
完整错误消息:
FetchError: request to http://127.0.0.1:8080/api failed, reason: connect ECONNREFUSED 127.0.0.1:8080
at ClientRequest.<anonymous> (/app/bundle/programs/server/npm/node_modules/meteor/fetch/node_modules/node-fetch/lib/index.js:1444:11)
at ClientRequest.emit (events.js:315:20)
at ClientRequest.EventEmitter.emit (domain.js:483:12)
at Socket.socketErrorListener (_http_client.js:426:9)
at Socket.emit (events.js:315:20)
at Socket.EventEmitter.emit (domain.js:483:12)
at emitErrorNT (internal/streams/destroy.js:92:8)
at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
at processTicksAndRejections (internal/process/task_queues.js:84:21)
=> awaited here:
at Function.Promise.await (/app/bundle/programs/server/npm/node_modules/meteor/promise/node_modules/meteor-promise/promise_server.js:56:12)
at imports/startup/filemigration.js:273:20
at /app/bundle/programs/server/npm/node_modules/meteor/promise/node_modules/meteor-promise/fiber_pool.js:43:40 {
type: 'system',
errno: 'ECONNREFUSED',
code: 'ECONNREFUSED'
}
这会有什么问题呢?也许是WSL2的安全问题?