簡體   English   中英

在 Docker 容器中將參數傳遞給 Python argparse

[英]Pass arguments to Python argparse within Docker container

我第一次嘗試使用 docker 容器。 我有一個 python 腳本,它調用幾個 API 並解析一個文件。 該腳本采用 API 的服務器 URL、API 密鑰和要解析的文件的文件路徑等參數。 我使用 argparse 在腳本中處理這些。

我如何將這些傳遞到 Docker 中? 我不想硬編碼任何東西,因為我希望將此腳本交給需要定期運行並根據結果采取行動的工程師。

感謝您的幫助。 我一直在搜索,但似乎建議將內容硬編碼到 dockerfile 中 - 我希望用戶能夠在運行時將它們放入。 或者也許我已經找到了答案,只是我不理解它......

如果我的術語不正確,我深表歉意——這是我第一次嘗試使用 Docker。

您這樣做的方式取決於您使用 docker 的方式。 如果要在已經運行的容器中運行腳本,可以使用 exec:

docker exec <yourContainerName> python <yourScript> <args>

或者,如果您有一個 docker 映像,其中您的腳本是入口點,則您傳遞給 docker run 命令的任何參數都將添加到入口點。

因此,如果您的 docker 文件如下所示:

FROM yourbase
....
ENTRYPOINT <yourScript>

然后你可以通過運行容器本身來運行腳本:

docker run --rm <yourImageName> <args>

根據您在下面的評論,您似乎想要此選項。 您應該更改 dockerfile 以指定

ENTRYPOINT ["python","./script.py"]

(而不是使用 CMD),然后您可以通過以下方式運行:

docker run --rm <yourImageName>  -a API_KEY - f FILENAME -o ORG_ID

所以讓我們假設你的命令在下面

python app.py "URL" "APIKEY" "filepath"

因此,您將以以下方式放置 Dockerfile

FROM python:3.6
WORKDIR /app
COPY app.py .
ENTRYPOINT ["python", "app.py"]

然后運行 ​​docker 容器的人會像下面那樣做

docker run -v /home/tarun/project/filetoparse.yaml:/config.yaml <yourimagename> "URL" "APIKEY" /config.yaml

如果您想提供更大的靈活性,您甚至可以使用環境變量

docker run -v /home/tarun/project/filetoparse.yaml:/config.yaml -e APIKEY="XYZ" <dockerimage> "URL" /config.yaml

然后在您的腳本中,您可以使用os.environ['APIKEY']讀取它

Dockerfile ,我使用這樣的CMD命令:

FROM python:3
COPY ./app /app
WORKDIR /app
RUN pip install --upgrade pip
RUN pip install --no-cache-dir -r req.pip
CMD ["python","start.py","(api-url) ","(api-key)","(file-path)"]

注意每個參數/參數,用昏迷分開

如果您使用標志,則需要拆分

CMD ["python","start.py","-u","(api-url) ","-k","(api-key)","-f","(file-path)"]

這個答案有點晚了,但對於任何未來的讀者,我想更傾向於提出的問題,即關於 argparse。

像@Chris 指出的基本思想就是它。 實現解決方案的一種方法是在 docker run 命令本身中將參數傳遞給image 然后將這些參數傳遞給您的ENTRYPOINT ,從而傳遞給 python 腳本。

這些文件通常看起來像這樣..

文件.py

import argparse
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('pos', type=str, help='Example Positional Argument') # will be accesible under args.POS
parser.add_argument('--opt', type=str , help='Example Optional Argument') # will be accesible with args.OPT

args = parser.parse_args()

# do something with pos and OPT

如果沒有 docker,你會運行這個文件(假設它在密碼中)作為python file.py --opt opt_val pos_val

文件

FROM python:<your_tag>
COPY ./file.py ./ # Assuming your Dockerfile and file.py are in the same directory

# some custom build steps

ENTRYPOINT ["python","./file.py"]

Docker 構建和運行命令

你用這個docker build --tag example:0.0.1 <dir>

下面顯示了多行(為了更好的可讀性)運行命令,

運行 Docker

docker run --rm \
   --name example.container \
   example:0.0.1 \
   --opt=opt_val \
   POS=pos_value

Docker 運行(powershell)

docker run --rm `
   --name example.container `
   example:0.0.1 `
   --opt=opt_val `
   POS=pos_value

所以這里有一些要點要記住:

  • Argparse 支持添加位置和可選參數,並且應該相應地傳遞給 docker docker run命令中的image
  • 上面指出的解決方案有效,但不像 id 通常喜歡的那樣靈活。 最好使用環境變量並通過os.environ()訪問腳本os.environ()
  • 使用此解決方案,您無需對 Dockerfile 進行任何“硬編碼”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM