![](/img/trans.png)
[英]Pass python arguments (argparse) within Docker container
[英]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 脚本。
这些文件通常看起来像这样..
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 build --tag example:0.0.1 <dir>
下面显示了多行(为了更好的可读性)运行命令,
docker run --rm \
--name example.container \
example:0.0.1 \
--opt=opt_val \
POS=pos_value
docker run --rm `
--name example.container `
example:0.0.1 `
--opt=opt_val `
POS=pos_value
所以这里有一些要点要记住:
docker run
命令中的image
。os.environ()
访问脚本os.environ()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.