从一个容器执行代码到另一个容器(即从API容器在工作容器上执行脚本)

时间:2019-01-14 19:34:25

标签: docker architecture docker-compose software-design

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

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

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

example

最好的方法是什么?

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

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

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

1 个答案:

答案 0 :(得分:2)

通常,运行长时间运行的脚本的解决方案是pub-sub模型。您的API会将消息放入执行消息队列中。 worker实例将订阅该队列,并在出现消息时执行您长时间运行的脚本/ query / etc。执行完成后,消息将返回不同的队列,或者结果将放置在预定位置(URL)。

这有两个优点:

  1. 两个解决方案彼此有效隔离
  2. 如果需要更多的能力,可以通过增加额外的工人来扩展LRS(工人)解决方案
  3. 如果LRS实例关闭,则API将不依赖于它的启动。实例可用时,工作将排队等待。