gpt4 book ai didi

ruby-on-rails - 在 docker 中为 rails 应用程序 rest-client 启用 CORS

转载 作者:行者123 更新时间:2023-12-02 20:14:54 24 4
gpt4 key购买 nike

我有两个应用程序在单独的 docker 镜像中运行。第一个暴露在端口 3000:3000 和第二个 4000:4000 上。第一个应用程序有一些资源,我想通过第二个应用程序使用 rest-client 获得。

可能是 docker 容器的问题。

以下是错误:

  • FilmsController#index 中的 Errno::ECONNREFUSED
  • 无法打开到 localhost:3000 的 TCP 连接(连接被拒绝 - “localhost”端口 3000 的连接(2))

  • //第一个应用程序:
  • 公开 上的资源http://localhost:3000/movies
  • 对其他网络开放
  • 允许跨源请求

  • 第一个应用程序的 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
  • 有一个模型电影
  • 一个 Controller

  • 电影型号:
    class Film
    require 'rest-client'
    def self.all
    RestClient.get 'localhost:3000/movies.json'
    end
    end

    电影 Controller :
    class FilmsController < ApplicationController
    def index
    render json: Film.all
    end
    end

    一切正常,因为它是一个应用程序。拆分成 出现问题两个 docker 容器 .我猜 一个容器阻止来自另一个的请求 ,但找不到解决方案。任何帮助将不胜感激。

    最佳答案

    默认情况下,每个 docker 容器都在单独的网络命名空间中运行,其中包括获取自己的私有(private)环回接口(interface)(又名 localhost),该接口(interface)与所有其他容器和主机分开。要在两个容器之间进行连接,它们需要在同一个 docker 网络上,然后只要该网络不是名为“bridge”(名称,而不是网络驱动程序)的默认网络,您就可以使用它们的容器在容器之间进行连接姓名。请注意,您不需要将容器的端口发布或公开给容器网络,前者仅用于允许外部访问容器。

    因此,如果您使用 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。

    关于ruby-on-rails - 在 docker 中为 rails 应用程序 rest-client 启用 CORS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44180711/

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