在我的Dockerfile中:
ENTRYPOINT ["python3", "start1.py"]
运行docker image时,我想使用start2.py
和参数year=2020
覆盖它。所以我跑:
docker run -it --entrypoint python3 start2.py year 2020 b43ssssss
它仍然运行start1.py
,我在做什么错了?
答案 0 :(得分:1)
出于两个原因,我倾向于建议使用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
运行辅助脚本,该脚本执行一些初始设置(等待数据库,重写配置文件,引导数据存储,...),然后执行{{ 1}}启动exec "$@"
。我倾向于为此模式保留CMD
,即使我不是特别需要它,也默认为ENTRYPOINT
。
我不建议使用CMD
拆分命令。在非常特定的情况下,想要运行备用Python脚本,它在ENTRYPOINT ["python3"]
命令中保存了一个单词,但是您仍然需要重复脚本名称(与“ entrypoint-as-command”模式不同),并且仍然如果要运行非Python的程序,则需要docker run
选项。
答案 1 :(得分:0)
它仍然运行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']
因此,仅使用一些默认的python3
(start1.py)将入口点转换为CMD
,这样您就可以控制要运行的文件。
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']