繁体   English   中英

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

[英]Pass argument to python script running in a docker container

假设以下设置:

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

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

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

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

还有其他方法吗?

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

我强烈建议将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)

...用于...的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权限。 如果涉及的任何文件名或路径都是动态的,则外壳注入攻击可能会危害您的系统 要特别注意如何从可通过网络访问的脚本运行此脚本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM