理解CMD和ENTRYPOINT是如何交互的

CMDENTRYPOINT指令定义了容器运行时应该执行什么命令。有一些规则描述了它们彼此之间的协作。

  1. Dockerfile中至少应该指定一个CMD或者ENTRYPOINT命令

  2. 当将容器作为可执行命令运行时,需要一个ENTRYPOINT

  3. CMD应该作为定义ENTRYPOINT默认参数的一种方式或者在容器中作为一个ad-hoc命令。

  4. 在运行带有替代参数的容器时,CMD将被覆盖。

下面的表列出了针对不同的ENTRYPOINT/CMD组合所执行的命令:

No ENTRYPOINT

ENTRYPOINT exec_entry p1_entry

ENTRYPOINT [“exec_entry”, “p1_entry”]

No CMD

error, not allowed

/bin/sh -c exec_entry p1_entry

exec_entry p1_entry

CMD [“exec_cmd”, “p1_cmd”]

exec_cmd p1_cmd

/bin/sh -c exec_entry p1_entry

exec_entry p1_entry exec_cmd p1_cmd

CMD [“p1_cmd”, “p2_cmd”]

p1_cmd p2_cmd

/bin/sh -c exec_entry p1_entry

exec_entry p1_entry p1_cmd p2_cmd

CMD exec_cmd p1_cmd

/bin/sh -c exec_cmd p1_cmd

/bin/sh -c exec_entry p1_entry

exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd

NOTE:

如果CMD是在基础镜像中定义的,设置ENTRYPOINT将重置CMD为空值。在这种情形下,CMD在当前的镜像中必须拥有一个值。

Last updated