gpt4 book ai didi

ruby-on-rails - 无法打开与本地主机 :3101 - Rails/Docker 的 TCP 连接

转载 作者:行者123 更新时间:2023-12-05 04:53:00 27 4
gpt4 key购买 nike

我正在尝试从我们的应用程序 ping 我们的 Rails 微服务之一(处理电子邮件),但出现标题错误。

我们的微服务在 localhost:3101 上的 docker 中运行,而我们的应用程序也在 docker 上的 localhost:3000 上运行 - 我已经用 postman 请求对它执行了 ping 操作,它工作正常。

我已经在我们的 ENV 变量中设置了我们的身份验证 token 和电子邮件服务 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 请求时,它实际上是在向它自己的 localhost (所以在容器内)而不是你机器的 localhost 。要解决此问题,不要尝试将请求发送到 localhost,而是让 docker 内的应用程序将请求发送到 host.docker.internal:DESIRED_PORT 这会告诉 docker 使用 localhost 它的主机。

您可以在此处阅读更多相关信息:

https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds

关于ruby-on-rails - 无法打开与本地主机 :3101 - Rails/Docker 的 TCP 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66277098/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com