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
指向預設引數。