簡體   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