Dockerfile中ENTRYPOINT和CMD

cmd格式

CMD [“executable”,“param1”,“param2”] (exec 格式, 推荐的格式)
CMD [“param1”,“param2”] (作为 ENTRYPOINT 的默认参数)
CMD command param1 param2 (shell 格式)

Dockerfile 中只能有一个 CMD 起效, 如果出现了多个, 则最后一个起效;

entrypoint格式

ENTRYPOINT [“executable”, “param1”, “param2”] (exec 格式, 推荐)
ENTRYPOINT command param1 param2 (shell 格式)

CMD 和 ENTRYPOINT 两种配置格式的区别是:

  • exec 格式 推荐这种格式, 使用这种模式时, 可以不需要 shell 进程, 让 Docker 应用的可执行程序成为容器的 PID 1 进程, 可以接收 Unix 信号, 比如执行 docker stop 时能够接收到 SIGTERM。
  • shell 格式 会始终调用一个 shell 进程, 成为 /bin/sh -c 的子命令, 可执行程序不能响应 Unix 信号。

注意: ENTRYPOINT 使用 shell 格式 时, 会忽略 CMD 和 run 传入的参数, 如果要替换默认的 ENTRYPOINT 命令, 则需要在执行 docker run 的时候指定 --entrypoint 参数。

总结:
CMD 可以用作 ENTRYPOINT 默认参数,或用作 Docker 的默认命令;
CMD 会被 docker run 传入的参数覆盖;
docker run 传入的参数会附加到 ENTRYPOINT 之后, 前提是使用了 exec 格式 。

测试截图:

使用exec格式时,运行传参时会覆盖掉‘cmd’的值,相反不传则使用‘cmd’参数。

image-20210611172737320

再试一下使用shell格式的ENTRYPOINT,结果是没有接收到cmd和运行时传入的参数。

image-20210611173115220


版权声明:本文为qq_39260440原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。