ruby-on-rails - 无法打开到 localhost:3101 的 TCP 连接 - Rails / Docker
问题描述
我正在尝试从我们的应用程序 ping 我们的 Rails 微服务(处理电子邮件)之一,我收到标题错误。
我们的微服务在 docker on 上运行localhost:3101
,而我们的应用程序也在 docker 上的 localhost:3000 上——我已经用邮递员请求对其进行了 ping 操作,它工作正常。
我已经在我们的 ENV 变量中设置了我们的身份验证令牌和电子邮件服务 API,如下所示:-
EMAIL_SERVICE=http://localhost:3101
EMAIL_SERVICE_TOKEN=1234
这是我的EmailService
:-
class EmailService
require 'net/http'
HEADER = { 'Content-Type': 'application/json' }.freeze
ENDPOINTS = {
root: ENV['EMAIL_SERVICE'],
test_email: {
post: {
url: '/api/test_email'
}
}
}
def initialize
@token = ENV['EMAIL_SERVICE_TOKEN']
end
def call_api(section, action, data, method='POST')
address_url = ENDPOINTS[section][action][:url]
uri = URI.parse("#{ENDPOINTS[:root]}#{address_url}")
# Create the HTTP objects
http = Net::HTTP.new(uri.host, uri.port)
if method == 'POST'
request = Net::HTTP::Post.new(
uri.request_uri,
HEADER
)
request.body = data.merge({ auth_token: @token }).to_json
else
request = Net::HTTP::Get.new(
uri.request_uri,
HEADER
)
end
http.use_ssl = true
response = http.request(request)
end
end
知道我错过了什么吗?
解决方案
我假设这两个微服务都运行在不同的 docker 容器上。
我认为问题在于,当 docker 从容器外部收到您的请求,然后尝试向localhost
它发出 HTTP 请求时,实际上是在向其 OWN localhost
(因此在容器内)发出请求,而不是向localhost
您的机器发出请求。为了解决这个问题,而不是尝试发送请求以localhost
使 docker 内的应用程序将请求发送到host.docker.internal:DESIRED_PORT
this 告诉 docker 使用localhost
它的主机。
您可以在此处阅读更多相关信息:
https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds
推荐阅读
- django - Django oauth 工具包是否可以仅使用客户端 ID 和机密 ID 登录?
- sql - 如何从 Information_Schema.Columns 中获取列的主键或键约束详细信息?
- javascript - 没有使用 jQuery 渲染 href
- ios - 向 UILabel 添加填充
- c# - C# 在 if 语句中使用一系列索引
- apache-spark - PySpark 存储级别默认值冲突?
- java - Xstream 在未完成时停止写入文件
- c - MIPS 汇编代码 - 试图找出这段代码是关于什么的
- visual-studio-mac - Visual Studio for MAC Community 在双显示器上字体模糊
- reactjs - 我应该在挂钩中使用 useMemo 吗?