我认为我没有正确的标题,但我不能100%确定正确的标题。我正在尝试将我拥有的Python程序容器化,该程序可以基于CLI参数作为服务器或客户端运行。我之所以能够成功地做到这一点,是因为我说:
FROM python:3.5
ADD program/ program/
WORKDIR program/
ENTRYPOINT ["python", "program.py"]
然后我可以用CCD_ 1(或CCD_。
不过,当我试图根据以前的图像创建图像时,我遇到了问题。
例如,如果我想创建一个特定于服务器的映像,我尝试过:
FROM program
ENTRYPOINT ["server"]
然后我的目标是通过说docker run programServer <port> <protocol>
来运行它,但是当我尝试时,我会得到executable file not found in $PATH"
错误。
是我错过了什么,还是你不能";菊花链";这样的图像?
两条备注:
-
每个映像应包含一个
ENTRYPOINT
和/或一个CMD
(在Dockerfile中定义或从其父映像继承(; -
每个
ENTRYPOINT
行覆盖以前的ENTRYPOINT
定义(因为Docker容器旨在运行一个进程,称为入口点(。
所以:
- 您应该只在第二个Dockerfile中编写
ENTRYPOINT ["python", "program.py", "server"]
(用于子映像( - 但您也可以将
docker run -d program server <port> <protocol>
0保留在您的第一个Dockerfile(用于父映像(中,因为这不会造成任何伤害,并且允许解决上面的规则1
但是如果父映像仅打算用作基本映像,则永远不要运行";"照原样";,并且不产生自然入口点,例如,您可以只放置一个打印警告/错误的伪CMD
,或者一个shell——例如,请参阅debian:10
的Dockerfile。
有关{ENTRYPOINT
,CMD
}的更多详细信息,请参阅以下SO答案:Dockerfile中的CMD和ENTRYPOINT之间有什么区别?