python - 用于运行带参数的 Python 程序的 Docker 文件

标签 python docker argparse

我是 Docker 新手。我有一个 Python 程序,我按以下方式运行。

python main.py --s=aws --d=scylla --p=4 --b=15 --e=local -w

请注意双连字符--前四个参数为前四个参数,最后一个参数为单个连字符“-”。

我正在尝试在 Docker 容器内运行它。这是我的 Dockerfile:

FROM python:3.6
COPY . /app
WORKDIR /app
RUN pip install --upgrade pip
RUN pip install --no-cache-dir -r requirements.txt
CMD ["python","app.py","--s","(source)", "--d","(database)","--w", "(workers)", "--b", "(bucket)", "--e", "(env)", "-w"]

我不确定这是否有效,因为我不知道如何测试和运行它。我想使用以下端口映射运行 Docker 镜像。

docker run --name=something -p 9042:9042 -p 7000:7000 -p 7001:7001 -p 7199:7199 -p 9160:9160 -p 9180:9180 -p 10000:10000 -d user/something

如何更正 Docker 文件?一旦我构建了图像如何运行它?

最佳答案

首先,修复 dockerfile:

FROM python:3.6
COPY . /app
WORKDIR /app
# optional: it is better to chain commands to reduce the number of created layers
RUN pip install --upgrade pip \
  && pip install --no-cache-dir -r requirements.txt
# mandatory: "--s=smth" is one argument
# optional: it's better to use environment variables for source, database etc
CMD ["python","app.py","--s=(source)", "--d=(database)","--w=(workers)", "--b=(bucket)", "--e=(env)", "-w"]

然后,构建它:

docker build -f "<dockerfile path>" -t "<tag to assign>" "<build dir (eg .)>"

然后,您可以使用分配的标签作为图像名称:

docker run ... <tag assigned>

UPD:我第一次就错了,应该使用标签而不是图像名称,而不是实例名称

UPD2:在第一个响应中,我假设您要对参数进行硬编码,并且只提到最好使用环境变量。以下是如何执行此操作的示例:

首先,更好的选择是直接在 Python 脚本中使用检查环境变量,而不是命令行参数。

首先,让你的Python脚本读取环境变量。 最快的肮脏方法是替换 CMD像这样的东西:

CMD ["sh", "-c", "python app.py --s=$SOURCE --d=$DATABASE --w=$WORKERS ... -w"]

(环境变量通常使用大写字母名称) 然而,最好直接在 Python 脚本中读取环境变量而不是命令行参数,或者将它们用作默认值:

# somewere in app.py
import os
...
DATABASE = os.environ.get('DATABASE', default_value)  # can default ot args.d
SOURCE = os.environ.get('SOURCE')  # None by default
# etc

在这种情况下也不要忘记更新 dockerfile

# Dockerfile:
...
CMD ["python","app.py"]

最后,将环境变量传递给您的运行命令:

docker run --name=something ... -e DATABASE=<dbname> -e SOURCE=<source> ... <tag assigned at build>

传递环境变量的方式还有很多,我这里引用官方文档: https://docs.docker.com/compose/environment-variables/

关于python - 用于运行带参数的 Python 程序的 Docker 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57528713/

相关文章:

python - 为每次获取更改用户代理字符串

多台计算机上的 Docker 机器主机环境?

amazon-web-services - 如何在 terraform 中将主机目录绑定(bind)到 ECS

Python argparse : Is there a way to specify a range in nargs?

javascript - Webpack:Django 中的 "Uncaught SyntaxError: Unexpected token <"

python - 使用 git 跟踪对 dropbox 的更改?

python - 使用 Python pypyodbc 到 SQL Server 的连接字符串

java - 无法连接到我的 Elasticsearch 实例 : NoNodeAvailableException

Python argparse 错误到文件

python - 如何在 uwsgi 配置中传递参数?