【问题标题】:Executing Code from one Container to Another (i.e. execute script on worker container from an API container )从一个容器执行代码到另一个容器(即从 API 容器在工作容器上执行脚本)
【发布时间】:2019-01-15 06:22:25
【问题描述】:

我有一个由四个容器组成的 docker-compose,所有容器都执行一个功能:

一个 nginx 代理,将 UI 和 API 请求转发到相应的容器(节点容器、flask 容器),如下图所示。

还有一个单独的容器,它执行长时间运行的 python 脚本并且独立于其他容器工作。我现在想通过 API 创建在“长期运行脚本”(LRS)容器中执行脚本的能力:

最好的方法是什么?

我看到了一些与此有些相似的其他问题,但提出的问题比他们回答的要多。我看到的建议包括:

  1. 将 docker.sock 传递到 API 容器中;从 API 容器中,执行到 LRS 并执行预期的脚本
    • 这不会造成严重的安全漏洞吗?
    • 这是否需要在API容器上安装docker才能执行,违反了docker的关注点分离原则?
  2. LRS 容器上的 HTTP 侦听器,侦听来自 API 的命令,以便在 LRS 上执行脚本
    • 再说一次,这是否违反了关注点分离,因为我现在基本上需要 LRS 容器中的轻量级 API 来监听来自主要 API 的操作?

这些解决方案似乎都不理想。我错过了什么吗?如何实现预期功能?

【问题讨论】:

    标签: docker architecture docker-compose software-design


    【解决方案1】:

    通常,运行长时间运行的脚本的解决方案是发布-订阅模式。您的 API 会将消息放到执行消息队列中。工作实例将订阅该队列,并且当消息出现时,将执行您长时间运行的脚本/查询/等。执行完成后,消息将返回到不同的队列,或者结果将放置在预定位置(url)。

    这有几个优点:

    1. 这两种解决方案有效地相互隔离
    2. 如果您需要更多容量,可以通过添加额外的工作人员来横向扩展 LRS(工作人员)解决方案
    3. 如果 LRS 实例关闭,API 将不依赖于它是否启动。当实例可用时,工作将排队等候。

    【讨论】:

    • 呵呵,没想到发布/订阅这样的东西,这是个好主意。如果我使用 RabbitMQ 之类的东西,这只需要一个额外的容器,并且不会产生关注点分离问题,因为我可以只使用相关的客户端,比如我的 API 中的 python 客户端,因为 API 已经用 Flask python 编写。
    • Celery 是一个用于 python 的任务队列,它可以使用 RabbitMQ 作为它的代理,并且对我来说已经很好地容器化了。 celeryproject.org
    猜你喜欢
    • 1970-01-01
    • 2021-09-10
    • 2018-10-08
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    相关资源
    最近更新 更多