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