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 指向默认参数。