我是 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/