簡體   English   中英

cmd和dockefile中的入口點之間的區別

[英]difference between cmd and entrypoint in dockefile

我是Docker的新手,對ockfile有一個簡單的問題。 我們可以在停靠文件中寫入入口點和CMD。 似乎在創建容器期間執行了入口點。 並且在啟動容器期間執行CMD。 這是真的?

不完全是:

ENTRYPOINT配置一個將作為可執行文件運行的容器。
因此它總是被執行(或默認的/bin/sh -c是)。

ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred)
ENTRYPOINT command param1 param2 (shell form)

ENTRYPOINT docker run <image>命令行參數將附加在exec形式ENTRYPOINT所有元素之后,並將覆蓋使用CMD指定的所有元素。

shell形式可防止使用任何CMD或運行命令行參數,但具有以下缺點: ENTRYPOINT將作為/bin/sh -c的子命令啟動,該子命令不傳遞信號。
這意味着可執行文件將不是容器的PID 1,並且不會接收Unix信號,因此您的可執行文件將不會從docker stop <container>接收到SIGTERM。

您可以將CMD視為ENTRYPOINT參數。
如果沒有入口點(默認命令為“ /bin/sh -c ”),則CMD可以包含可執行文件。
如果ENTRYPOINT已經運行了可執行文件,則CMD參數是該命令的參數(如果使用docker run而沒有其他參數)。


使用docker start ,如問題1437中所述 ,將執行ENTRYPOINT ,但僅使用CMD參數(因此使用CMD ,但不能在命令行上使用您自己的參數覆蓋它)。
如果要使用CMD,則需要docker run ,而不是docker start

實際上,最近有一個正在進行的PRPR 19746 ),它允許--cmd start命令使用可選的--cmd-c )標志來指定要使用的cmd,而不是cmd / entrypoint中的默認cmd。


Dockerfile官方文檔現在具有“ 了解CMD和ENTRYPOINT如何交互 ”部分:

  • Dockerfile應至少指定CMDENTRYPOINT命令之一。
  • 使用容器作為可執行文件時,應定義ENTRYPOINT
  • 應將CMD用作為ENTRYPOINT命令定義默認參數或在容器中執行自定義命令的方式。
  • 使用替代參數運行容器時, CMD將被覆蓋。

這意味着,如果您的Dockerfile包含:

  • 沒有CMD

    • 如果沒有ENTRYPOINT :錯誤,則不允許
    • ENTRYPOINT exec_entry p1_entry表示/bin/sh -c exec_entry p1_entry
    • ENTRYPOINT ["exec_entry", "p1_entry"]表示exec_entry p1_entry
  • CMD ["exec_cmd", "p1_cmd"] (一個命令,一個參數)

    • 如果沒有ENTRYPOINTexec_cmd p1_cmd
    • ENTRYPOINT exec_entry p1_entry表示/bin/sh -c exec_entry p1_entry exec_cmd p1_cmd
    • ENTRYPOINT ["exec_entry", "p1_entry"]表示exec_entry p1_entry exec_cmd p1_cmd
  • CMD ["p1_cmd", "p2_cmd"]

    • 如果沒有ENTRYPOINTp1_cmd p2_cmd
    • ENTRYPOINT exec_entry p1_entry表示/bin/sh -c exec_entry p1_entry p1_cmd p2_cmd (好)
    • ENTRYPOINT [“exec_entry”, “p1_entry”]表示exec_entry p1_entry p1_cmd p2_cmd
  • CMD exec_cmd p1_cmd

    • 如果沒有ENTRYPOINT/bin/sh -c exec_cmd p1_cmd
    • ENTRYPOINT exec_entry p1_entry表示/bin/sh -c exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd
    • ENTRYPOINT [“exec_entry”, “p1_entry”]表示exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM