Dockerfile 中的 CMD 和 ENTRYPOINT 有什麼區別?


我們可以透過在 Dockerfile 中指定指令來構建 Docker 映象。Dockerfile 允許我們指定逐步指令,這些指令定義了建立容器環境的規則。Docker 容器是為要在其中執行的特定任務和程序而建立的。Dockerfile 中使用了三個重要的指令,這些指令允許我們定義需要在容器內執行哪些程序以及它們的順序。

這三個指令是:

  • RUN
  • CMD
  • ENTRYPOINT

RUN 指令很簡單。我們可以使用 RUN 指令定義我們想要在容器內執行的簡單子命令。例如,如果我們想要安裝一個 pip 包,我們可以在 Dockerfile 中簡單地使用“RUN pip install package_name”指令。

然而,另外兩個指令——CMD 和 ENTRYPOINT,可能會讓人感到困惑,特別是對於初學者而言。在本文中,我們將討論這兩個命令的用例和區別,以及一些有用的示例。但在我們深入瞭解它們之前,我們需要了解 Dockerfile 中編寫指令的 shell 形式和 exec 形式。

Shell 形式

當我們使用 shell 形式指定指令時,正常的 shell 處理會在後臺進行。守護程序在執行 shell 形式的命令時會在後臺呼叫命令 shell。在 shell 形式中指定命令的格式是:

$ <instruction> <command>

可執行形式

當我們編寫可執行形式的命令並執行這些命令時,正常的 shell 處理不會在後臺發生。相反,可執行檔案會直接被呼叫。在可執行形式中指定命令的格式是:

$ <instruction> ["executable", "parameter", "parameter", . . . .]

shell 形式的命令通常用於 RUN 指令,而可執行形式的命令通常用於 CMD 和 ENTRYPOINT 指令。

CMD 指令

您可以使用 CMD 指令設定帶有引數的預設命令。如果您執行 Docker 容器時沒有指定任何額外的 CLI 命令,則將執行 CMD 指令。您可以將可執行檔案包含為預設命令。但是,如果您選擇省略它,則必須與 CMD 指令一起指定 ENTRYPOINT 指令。

如果您在 Docker run 命令中指定了引數,則使用 CMD 指令指定的預設引數將被忽略。此外,如果您在一個 Dockerfile 中指定了多個 CMD 指令,則只會執行最後指定的那個。

CMD 指令有三種形式:

  • CMD ["only_executable","parameter_1","parameter_1"] (可執行形式)
  • CMD ["parameter_1","parameter_2"] (用於為 ENTRYPOINT 指令提供預設引數)
  • CMD command param1 param2 (shell 形式)

示例:

$ CMD echo "Command in Shell Form"
$ CMD ["/bin/bash", "-c", "echo Command in Exec Form"]

ENTRYPOINT 指令

ENTRYPOINT 指令看起來與 CMD 指令幾乎相同。但是,它們的主要區別在於,它不會忽略您在 Docker run 命令(CLI 引數)中指定的任何引數。

當我們以可執行形式指定 ENTRYPOINT 指令時,它允許我們使用 Dockerfile 中的 CMD 指令設定或定義一些附加引數。如果我們使用 shell 形式,它將忽略任何 CMD 引數甚至任何 CLI 引數。

ENTRYPOINT 指令的形式是:

  • ENTRYPOINT ["only_executable", "parameter_1", "parameter_2"] (可執行形式)
  • ENTRYPOINT command parameter_1 parameter_2 (shell 形式)

示例:

$ ENTRYPOINT echo "Welcome to TutorialsPoint"
$ ENTRYPOINT ["/bin/bash", "-c", "echo Welcome to TutorialsPoint"]

最終想法!

總而言之,如果您想指定啟動 Docker 容器時需要執行的帶有引數的預設命令,可以使用 CMD 指令。如果您在 Docker run 命令中指定了引數,則使用 CMD 指令指定的引數將被忽略。這意味著使用 Docker run 命令的 CLI 引數將覆蓋使用 CMD 指令指定的引數。

另一方面,ENTRYPOINT 指令有兩種情況。如果您以 shell 形式使用 ENTRYPOINT 指令,並且您使用 CLI 引數甚至透過 CMD 命令提供其他引數,則 ENTRYPOINT 指令將覆蓋所有這些引數。但是,如果您以可執行形式使用 ENTRYPOINT 指令,則可以使用 CMD 指令設定其他引數。

根據您的需求和用例,您可以採用其中任何一個命令。

更新於:2021年8月6日

3K+ 次瀏覽

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.