ENTRYPOINT 和 CMD 之間的區別

有兩個 Dockerfile 指令用於指定在構建映像中預設執行的命令。如果你只指定 CMD,那麼 docker 將使用預設的 ENTRYPOINT 執行該命令,即/bin/sh -c。啟動構建的映像時,可以覆蓋入口點和/或命令之一或兩者。如果同時指定兩者,則 ENTRYPOINT 指定容器程序的可執行檔案,CMD 將作為該可執行檔案的引數提供。

例如,如果你的 Dockerfile 包含

FROM ubuntu:16.04
CMD ["/bin/date"]

然後你使用/bin/sh -c 的預設 ENTRYPOINT 指令,並使用該預設入口點執行/bin/date。你的容器流程的命令將是/bin/sh -c /bin/date。執行此影象後,預設情況下會列印出當前日期

$ docker build -t test .
$ docker run test
Tue Jul 19 10:37:43 UTC 2016

你可以在命令列上覆蓋 CMD,在這種情況下,它將執行你指定的命令。

$ docker run test /bin/hostname
bf0274ec8820

如果指定 ENTRYPOINT 指令,Docker 將使用該可執行檔案,CMD 指令指定命令的預設引數。所以如果你的 Dockerfile 包含:

FROM ubuntu:16.04
ENTRYPOINT ["/bin/echo"]
CMD ["Hello"]

然後執行它會產生

$ docker build -t test .
$ docker run test
Hello

如果你願意,你可以提供不同的引數,但它們都會執行/bin/echo

$ docker run test Hi
Hi

如果要覆蓋 Dockerfile 中列出的入口點(即,如果要在此容器中執行與 echo 不同的命令),則需要在命令列中指定 --entrypoint 引數:

$ docker run --entrypoint=/bin/hostname test
b2c70e74df18

通常,你使用 ENTRYPOINT 指令指向要執行的主應用程式,並使用 CMD 指向預設引數。