使用Python和参数/覆盖Dockerfile入口点



在我的Dockerfile:中

ENTRYPOINT ["python3", "start1.py"]

当我运行docker镜像时,我想用参数year=2020start2.py覆盖它。所以我运行:

docker run -it --entrypoint python3 start2.py year 2020 b43ssssss

它仍然运行start1.py,我做错了什么?

它仍然运行start1.py,我做错了什么?

因为任何以CMD形式传递且入口点为ENTRYPOINT ["python3", "start1.py"]的内容都将作为参数传递给python文件start1.py。您可以通过以下进行验证

import argparse, sys
print  ("All ARGs",sys.argv[1:])

所以输出将是

All ARGs ['start2.py', 'year', '2020', 'b43ssssss']

因此,只使用一些默认的CMD(start1.py(将入口点转换为python3,这样您就可以控制运行哪些文件。

ENTRYPOINT ["python3"]
# Default file to run
CMD ["start1.py"]

然后在运行时覆盖

docker run -it --rm my_image start2 year 2020 b43ssssss

现在args应该是

All ARGs ['year', '2020', 'b43ssssss']

出于几个原因,我倾向于建议使用CMD而不是ENTRYPOINT作为默认值。这个问题就是其中之一:如果您需要在运行时覆盖该命令,那么如果您指定CMD会更容易。

# Change ENTRYPOINT to CMD
CMD ["python3", "start1.py"]
# Run an alternate script
docker run -it myimage 
python3 start2.py year 2020 b43ssssss
# Run a debugging shell
docker run --rm -it myimage 
bash
# Quickly double-check file contents
docker run --rm -it myimage 
ls -l /app
# This is what you're trying to avoid
docker run --rm -it 
--entrypoint /bin/ls 
myimage 
-l app

还有一种有用的模式,使用ENTRYPOINT运行辅助脚本,该脚本进行一些初始设置(等待数据库、重写配置文件、引导数据存储等(,然后执行exec "$@"以启动CMD。我倾向于为这个模式保留ENTRYPOINT,并默认为CMD,即使我不特别需要它

我不建议使用ENTRYPOINT ["python3"]拆分命令。在想要运行备用Python脚本的特定情况下,它会在docker run命令中保存一个单词,但您仍然需要重复脚本名称(与"entrypoint as command"模式不同(,如果您想要运行非Python脚本,则仍然需要--entrypoint选项。