繁体   English   中英

将Rails和React应用程序拆分到单独的Docker容器中?

[英]Splitting up a Rails and React app into separate Docker containers?

我有一个带有Rails后端和React前端的应用程序。 我将其部署在Docker容器中:一个用于应用程序,一个用于postgres,一个作为数据量容器。 我可以使用它,但是应用程序映像文件很大(3Gb!),并且构建时间很长。

我希望有一种拆分方法。 React应用程序需要一堆Node包,但仅用于开发。 一旦全部打包,React应用程序本质上就是静态文件。 而且,Rails应用程序根本不需要Node。

我不需要生产映像中的所有开发时工具,但实际上,我觉得我需要将所有这些都放在同一代码库中,这样我(最终)可以建立一个可以构建的CI / CD环境。该应用程序并运行所有测试。 有没有一种方法可以使我有一个用于React / Node应用程序的容器和一个用于Rails的容器,并在运行时将它们连接起来?

我认为您可能已经找到问题的答案-拆分代码库。

我们所有人都有某种下意识的反应,希望将项目中的所有内容都保留在同一回购中。 感觉很安全。 处理单独的存储库似乎很可怕,但是对于大多数初学者来说,不要将CSS和JS拼凑成HTML。

我觉得我需要将所有内容都放在同一代码库中,以便(最终)可以设置一个CI / CD环境以构建应用程序并运行所有测试

那就太好了-但是通过Ruby或自动浏览器测试javascript速度很慢。 您最终需要一组“快速”的单元测试和一个缓慢的“套件”的集成测试,这需要15分钟以上的时间。

那么还有什么选择呢?

您的API和SPA应用程序(角度)实际上做了非常不同的事情。

该API接收HTTP请求并输出JSON。 它在Ruby on Rails服务器上运行,并与数据库甚至其他API进行对话。

您可以通过发送HTTP请求并测试响应来对API进行集成测试。

您的API并不应该真正在乎请求是否来自Fuzzle小部件,并呈现出幸福的表情。 它不是API的工作。

RSpec.describe 'Pets API' do

  let!(:pet) { create(:pet) }
  let(:json) { JSON.parse(response.body) }

  describe 'GET /pets' do
    get '/pets'
    expect(json["name"]).to eq pet.name
  end
end

SPA服务器基本上只需要提供静态HTML和足够的javascript即可滚动工作。

一个Docker容器在这里似乎几乎是个杀手--您只想在反向代理或负载均衡器后面安装一台nginx服务器,因为您只提供一件事。

您应该具有用JavaScript编写的测试,可以模拟API服务器或与假API服务器进行通信。 如果确实需要,则可以使浏览器自动化,并让其与API的测试版本进行通讯。

您的SPA很可能会拥有自己的基于JS的工具包和构建过程,最重要的是,它将拥有自己的测试套件。

当然,这固执己见,但请仔细考虑-这两个项目都将从拥有自己的基础架构和明确的重点中受益。 尤其是API部分,如果您开始围绕用户界面进行构建,最终可能会变得很奇怪。

您可以在github.com/yovasx2/aquacontrol上查看我的rails react项目

别忘了开始并分叉它

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM