0

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

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

我想隔离整个平台的两个部分。Python Django 部分在一个容器上,jar 文件(它是一个开源工具)在另一个 alpine 容器上运行。

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

  • 我应该在 jar 文件上创建另一个 Django 包装器以公开一些端点,以便第一个容器可以运行它吗?并且可能使包装器处理eval()用于运行该工具的 GET 请求?
  • 还有其他方法可以增强此架构吗?

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

4

1 回答 1

0

在没有 Docker 的情况下,你现在设置工具的方式没有任何问题,除非你试图解决一些特定的问题,否则我会继续做你正在做的事情。

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

将其重新构建为与 Docker 一起工作的形式将涉及一些重新设计,这对于您要解决的实际问题来说是次要的。两种典型做法:

  1. 与其让 Java 工具成为一个运行一次然后退出的工具,不如让它成为一个带有 HTTP 接口的长时间运行的进程。Django 前端将 HTTP POST 一个它想要处理的文件,并在 HTTP 响应中返回结果。

  2. 部署像 RabbitMQ 这样的作业队列。当 Django 应用程序有一个想要处理的文件时,它会将其发布到作业队列中。将 Java 工具包装在一个从请求队列中读取、处理并写入响应队列的工作程序中。Django 应用程序然后能够获取响应。

最后一个选项是“最工业化的”——如果您需要一次处理数千个文件,根据工作负载增加和减少 Java 工作人员的数量,并且通常将其作为生产网络服务运行,这是一个好方法。这听起来不像你想要的规模。

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

于 2019-09-21T13:42:35.863 回答