如何在Docker上管理Java和Python应用程序?

2020年1月17日 9点热度 0条评论

我有一个基于Django的Python应用程序,它在docker容器上运行。该应用程序浏览文件系统,并对一些XML文件进行分析,提取嵌入式源代码并将其导出到单独的文件中。

该应用程序应运行一个Java jar文件,该文件对Django Web应用程序生成的文件进行静态代码分析。

我想隔离整个平台的两个部分。 Python Django部分位于容器上,jar文件(这是一个开放源代码工具)在另一个高山容器上运行。

现在,我想继续开发该工具,并使Django应用通过生成的每个包含源代码的文件上的命令运行该工具。

我是否应该在jar文件上创建另一个Django包装器以暴露一些端点,以便第一个容器可以运行它?并可能使包装程序处理将使用eval()运行该工具的GET请求?
我还有其他方法可以增强此体系结构吗?

编辑:我正在使用的工具:https://github.com/AbletonDevTools/groovylint

解决方案如下:

没有Docker,您现在设置工具的方式没有任何问题,除非您尝试解决某些特定问题,否则我将继续做您正在做的事情。

当您将问题描述写为“浏览文件系统”,“导出到文件”,“运行jar文件”时,这不是在Docker中运行良好的架构。在容器之间共享文件非常棘手(需要启动时选项,存在潜伏的权限问题),一个容器不能直接在另一个容器中运行命令,并且一个容器如果没有不受限制的根级访问权限的信任就无法启动另一个容器在整个系统上。

将其重建为可以与Docker很好地配合使用的形式将涉及一些重新设计,这是您要解决的实际问题的第二种选择。两种典型方法:

与其将Java工具变成只运行一次并退出的工具,不如将它变成一个具有HTTP接口的长期运行的过程。 Django前端将对要处理的文件进行HTTP POST,然后将结果返回到HTTP响应中。
部署像RabbitMQ这样的作业队列。当Django应用程序具有要处理的文件时,它将其发布到作业队列中。将Java工具包装在一个从请求队列中读取,进行处理并写入响应队列的工作器中。然后,Django应用程序便可以接收响应。

最后一个选项是“最工业化”-如果您需要一次处理成千上万个文件,根据工作负载来放大和缩小拥有的Java工人的数量,并且通常将其作为生产网络服务运行,好方法。这听起来不像您想要的规模。

最后:您绝对不要eval()任何东西,尤其应该绝对不要eval()从HTTP请求中获得的东西。那是一场巨大的安全灾难,正在等待发生。 (可以访问您的服务的任何人都可以读取或写入您的服务可以的任何文件,甚至可能更改该服务正在运行的代码;这很容易成为有人接管您整个系统的情况。)