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