在docker for rails应用程序rest-client中启用CORS
我有两个应用程序运行在不同的泊坞窗图像。 首先暴露在端口3000:3000和第二4000:4000。 第一个应用程序有一些资源,我想通过第二个应用程序使用rest-client获取。
docker集装箱可能是个问题。
这里有错误:
-
Errno :: ECONNREFUSED在FilmsController#index中
-
无法打开TCP连接到本地主机:3000(连接被拒绝 – 连接(2)为“本地主机”端口3000)
//第一个应用程序:
- 公开http:// localhost:3000 / movies上的资源
- 对其他networking开放
- 允许交叉来源请求
第一个应用程序的application.rb文件
module Movies class Application < Rails::Application config.web_console.whiny_requests = false config.middleware.insert_before 0, Rack::Cors do allow do origins '*' resource '*', :headers => :any, :methods => [:get, :post, :options] end end end end
//第二个应用程序:
- 在端口上运行:4000
- 有一个模型电影
- 一个控制器
电影模型:
class Film require 'rest-client' def self.all RestClient.get 'localhost:3000/movies.json' end end
films_controller:
class FilmsController < ApplicationController def index render json: Film.all end end
因为它是一个应用程序,一切工作正常。 当我分成两个docker集装箱时出现问题。 我想, 一个容器阻止来自另一个容器的请求 ,但找不到解决scheme。 任何帮助将非常感激。
每个docker容器默认运行在一个单独的networking名称空间中,其中包括获取独立于每个其他容器和主机的专用回送接口(又称localhost)。 要连接两个容器,它们需要在同一个dockernetworking上,然后只要该networking不是名为“bridge”(名称,不是networking驱动程序)的默认networking,就可以使用其容器名称。 请注意,您不需要将容器的端口发布或公开到容器networking,前者仅用于允许外部访问容器。
所以,如果你使用docker run
(否则你应该包括你的docker-compose.yml),你会有:
docker network create railsnet docker run --net railsnet --name=app1 ... docker run --net railsnet --name=app2 ...
然后,如果app1在容器内的端口3000上侦听,则可以从app2连接到app1:3000 / xyz。