在我的Dockerfile:中
ENTRYPOINT ["python3", "start1.py"]
当我运行docker镜像时,我想用参数year=2020
的start2.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
选项。