Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Docker容器中将参数传递给Python argparse_Python_Docker_Command Line Arguments - Fatal编程技术网

在Docker容器中将参数传递给Python argparse

在Docker容器中将参数传递给Python argparse,python,docker,command-line-arguments,Python,Docker,Command Line Arguments,我开始了我第一次尝试使用docker容器。我有一个python脚本,它调用几个API并解析一个文件。该脚本为API的服务器URL、API密钥和要解析的文件的文件路径获取参数。我在脚本中使用argparse来处理这些问题 我怎样才能把这些交给Docker?我不想硬编码任何东西,因为我希望将此脚本交给需要定期运行此脚本并根据结果采取行动的工程师 谢谢你的帮助。我一直在搜索,但似乎建议将内容硬编码到dockerfile中-我希望用户能够在运行时将这些内容放入。或者也许我已经找到了答案,只是不明白而已

我开始了我第一次尝试使用docker容器。我有一个python脚本,它调用几个API并解析一个文件。该脚本为API的服务器URL、API密钥和要解析的文件的文件路径获取参数。我在脚本中使用argparse来处理这些问题

我怎样才能把这些交给Docker?我不想硬编码任何东西,因为我希望将此脚本交给需要定期运行此脚本并根据结果采取行动的工程师

谢谢你的帮助。我一直在搜索,但似乎建议将内容硬编码到dockerfile中-我希望用户能够在运行时将这些内容放入。或者也许我已经找到了答案,只是不明白而已


如果我的行话不对,我深表歉意-这是我第一次尝试使用Docker。

你这样做的方式取决于你如何使用Docker。如果要在已运行的容器中运行脚本,可以使用exec:

docker exec <yourContainerName> python <yourScript> <args>
(而不是使用CMD) 然后您可以通过以下方式运行:

docker run --rm <yourImageName>  -a API_KEY - f FILENAME -o ORG_ID
docker run--rm-a API\u KEY-f FILENAME-o ORG\u 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“URL”“APIKEY”/config.yaml
如果您想提供更大的灵活性,甚至可以使用环境变量

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

然后在您的脚本中,您可以使用
os.environ['APIKEY']

Dockerfile
中,我使用如下命令:

FROM yourbase
....
ENTRYPOINT <yourScript>
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)"]
注意每个参数,用coma分开

如果您使用的是标志,则需要拆分

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

这个答案有点晚了,但对于未来的读者,我想让它更接近于所提出的问题,即关于argparse的问题

像@Chris指出的基本想法就是这样。实现此解决方案的一种方法是在docker run命令本身中将参数传递给
图像。然后,这些参数将被传递到
入口点
,从而传递到python脚本

这些文件通常看起来像这样

file.py 如果没有docker,您将以
python file.py--opt opt\u val pos\u val

Dockerfile Docker run(powershell) 因此,这里有几点需要记住:

  • Argparse支持添加位置参数和可选参数,并应相应地传递给
    docker run
    命令中的
    image
  • 上面指出的解决方案是可行的,但并不像我通常希望的那样灵活。最好使用
    os.environ()
    在脚本内部使用环境变量和访问
  • 使用此解决方案,您不会将任何内容“硬编码”到Dockerfile

所以我的python脚本就是这个容器的原因。我只是在Dockerfile中有:“CMD[“python”,“/script.py”]”,但我想传递“-a API_KEY-f FILENAME-o ORG_ID”,所以我从两个响应中提取了一些信息,并在需要的地方得到了它。谢谢你的帮助,但我不知道该把谁标记为“答案”。。。
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)"]
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

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