作者信息:https://home.cnblogs.com/u/huangjiabobk

在Docker中,docker run cmd entrypoint 有什么区别?

在Docker中,docker runCMDENTRYPOINT 是相互关联又各有不同的概念,它们都涉及到如何配置和启动容器。下面详细介绍它们的区别和联系:

  1. docker run

    • docker run 是 Docker 客户端命令,用于创建一个新的容器并运行其中的应用程序。当你执行 docker run 时,你可以指定一系列参数,如镜像名称、命令、环境变量、端口映射、卷挂载等。它接受的命令行参数可以用来覆盖或者附加到镜像构建阶段定义的 CMDENTRYPOINT 指令。
  2. CMD

    • 在 Dockerfile 中,CMD 指令用于定义容器启动时默认执行的命令及其参数。它可以有三种格式:

      • CMD ["executable", "param1", "param2"]:JSON数组格式,推荐使用,exec形式执行程序,不会经过shell解析。
      • CMD ["param1", "param2"]:如果指定了 ENTRYPOINT,那么 CMD 中的参数将作为 ENTRYPOINT 的参数传递。
      • CMD command param1 param2:shell格式,会通过shell执行命令。
    • 如果用户在 docker run 命令后面指定了命令,则 CMD 中定义的默认命令会被新指定的命令替换。若没有指定命令,则执行 CMD 中指定的命令。

  3. ENTRYPOINT

    • ENTRYPOINT 也是在 Dockerfile 中定义的,它用于指定容器启动时始终执行的命令,这个命令不那么容易被 docker run 的命令行参数覆盖,除非以组合的形式追加参数。

    • ENTRYPOINT 也有两种格式,与 CMD 相似:

      • ENTRYPOINT ["executable", "param1"]:exec形式,优先级高于 CMD,并且无论是否提供 docker run 后的命令,都会执行此命令,并将 docker run 后的参数追加到 ENTRYPOINT 后。
      • ENTRYPOINT command param1:shell格式。
    • 使用 ENTRYPOINT 可以确保每次容器启动时都执行同一命令,这有助于将容器设计得更加“应用导向”,使得容器的行为更一致。当同时设置了 CMDENTRYPOINT 时,CMD 的内容会被视为 ENTRYPOINT 的参数。

总结起来:

  • CMD 是容器启动时如果没有指定命令时的默认行为,它的灵活性较高,易于被 docker run 后的命令覆盖。
  • ENTRYPOINT 更像是容器的核心功能定义,常用于定义容器的主应用程序,并且能接收 docker run 的参数,这样可以确保容器启动时总是执行预期的程序,并且可以处理任何额外的参数。

综上所述,两者可以配合使用,共同决定容器启动时的具体行为,从而更好地控制容器的应用场景和定制程度。

posted @ 2024-03-04 09:05  黄嘉波  阅读(45)  评论(0编辑  收藏  举报
版权声明:原创作品,谢绝转载!否则将追究法律责任。--作者 黄嘉波