假设以下设置:
我想获取此上传的数据并将其传递给python脚本。
我找不到任何解释如何将动态生成的输入传递到容器中的东西。
是否可以通过从laravel应用程序内部执行shell脚本来完成此任务,该脚本包含上传的文件作为dockerfile的ENTRYPOINT中指定的变量?
还有其他方法吗?
答案 0 :(得分:0)
一种实现方法是将文件上传到Docker容器可以访问的目录,然后使用Python脚本在目录中轮询新文件。您可以使用"bind mounts"从Docker容器访问本地目录。 Google类似“如何在Docker容器和主机系统之间共享数据”之类的内容,以了解有关绑定安装和共享卷的更多信息。
答案 1 :(得分:0)
为此,我强烈建议使用tcp / ip。顺便说一下,在这种情况下,您将从以下方面受益:
实施非常简单。您可以选择任何框架,但对我来说合适的是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
路径都在容器的专用文件系统空间中。
有两个大警告:
docker run -v
选项中的主机路径是物理主机上特定的路径。如果您的HTTP服务也在容器中运行,则需要知道一些您可以写入的主机系统路径,该路径在容器文件系统中也是可见的。
完全有效地运行任何docker
命令都需要root特权。如果涉及的任何文件名或路径都是动态的,则 shell注入攻击可能会危害您的系统。请注意如何从可通过网络访问的脚本运行此脚本。