将参数传递给在Docker容器中运行的python脚本

时间:2018-12-18 12:19:43

标签: python laravel docker dockerfile

假设以下设置:

  • 用php / laravel编写的网站
  • 用户上传文件(文本/ doc / pdf)
  • 我们有一个docker容器,其中包含一个python脚本,用于将文本转换为numpy数组。

我想获取此上传的数据并将其传递给python脚本。

我找不到任何解释如何将动态生成的输入传递到容器中的东西。

是否可以通过从laravel应用程序内部执行shell脚本来完成此任务,该脚本包含上传的文件作为dockerfile的ENTRYPOINT中指定的变量?

还有其他方法吗?

3 个答案:

答案 0 :(得分:0)

一种实现方法是将文件上传到Docker容器可以访问的目录,然后使用Python脚本在目录中轮询新文件。您可以使用"bind mounts"从Docker容器访问本地目录。 Google类似“如何在Docker容器和主机系统之间共享数据”之类的内容,以了解有关绑定安装和共享卷的更多信息。

答案 1 :(得分:0)

为此,我强烈建议使用tcp / ip。顺便说一下,在这种情况下,您将从以下方面受益:

  • 您可以检测python服务是否在线
  • 您可以将python容器移动到另一台机器上

实施非常简单。您可以选择任何框架,但对我来说合适的是Twisted,并按如下所示实现您的python脚本:

from twisted.internet.protocol import Factory, Protocol
from twisted.protocols.basic import LineReceiver

class DataProcessor(LineReceiver):
  def lineReceived(self, line):
    # line contains your data
    pass

Factory factory = Factory()
factory.protocol = DataProcessor
reactor.listenTCP(8080, factory)

答案 2 :(得分:0)

  

...的python脚本...

只需运行它;不要将其打包到Docker容器中。如果它的输入和输出都是本地文件,并且它希望执行该操作并立即退出,则这是双重事实:Docker提供的文件系统隔离在这里对您不利。


这在技术上当然是可能的。取决于支持程序容器的设置方式,docker run末尾的“命令”对于sys.argv中的Python脚本将是可见的,就像其他命令行选项一样。您可以使用docker run -v选项将主机文件系统的一部分发布到容器中。这样您就可以运行类似的东西

docker run --rm -v $PWD/files:/data \
  converter_image \
  python convert.py /data/in.txt /data/out.pkl

所有/data路径都在容器的专用文件系统空间中。

有两个大警告:

  1. docker run -v选项中的主机路径是物理主机上特定的路径。如果您的HTTP服务也在容器中运行,则需要知道一些您可以写入的主机系统路径,该路径在容器文件系统中也是可见的。

  2. 完全有效地运行任何docker命令都需要root特权。如果涉及的任何文件名或路径都是动态的,则 shell注入攻击可能会危害您的系统。请注意如何从可通过网络访问的脚本运行此脚本。