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

时间:2020-07-22 03:04:21

标签: python docker

在我的Dockerfile中:

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

运行docker image时,我想使用start2.py和参数year=2020覆盖它。所以我跑:

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

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

2 个答案:

答案 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']