简述Docker中CMD和ENTRYPOINT区别 ?

参考回答

在 Docker 中,CMDENTRYPOINT 都用于定义容器启动时运行的命令,但它们之间有一些关键的区别。

  1. CMD
    • CMD 提供默认的命令和参数,如果用户在运行容器时没有指定命令,则会使用 CMD 中定义的命令。
    • 语法格式:
      CMD ["executable", "param1", "param2"]
      CMD ["param1", "param2"]  # 如果ENTRYPOINT存在,CMD会作为参数传递给ENTRYPOINT
      CMD "executable param1 param2"  # 适用于shell形式
      
      Docker
  2. ENTRYPOINT
    • ENTRYPOINT 用来指定容器启动时的主要命令,不会被用户传入的命令所覆盖。
    • 语法格式:
      ENTRYPOINT ["executable", "param1", "param2"]
      ENTRYPOINT ["executable", "param1", "param2"] # shell 格式
      
      Docker

详细讲解与拓展

  1. CMD 的作用
    • CMD 主要用于提供默认命令或参数,它只在没有指定其他命令时才会生效。如果你运行容器时没有指定命令,则 CMD 中指定的命令会自动执行。
    • CMD 可以指定一个可执行文件或一个包含命令的 shell。
    • 例如:
      CMD ["nginx", "-g", "daemon off;"]
      
      Docker

      这里,`CMD` 会启动 nginx 容器并运行指定的命令。用户如果在运行容器时指定其他命令,`CMD` 的命令将被覆盖。

  2. ENTRYPOINT 的作用
    • ENTRYPOINT 主要用于指定容器的主命令,并且无论运行容器时是否指定其他命令,ENTRYPOINT 中定义的命令都会始终执行。
    • ENTRYPOINT 的作用类似于一个“不可覆盖”的启动命令。即使用户传递了新的命令或参数,ENTRYPOINT 会先执行,然后再附加这些命令参数。
    • 例如:
      ENTRYPOINT ["nginx", "-g", "daemon off;"]
      
      Docker

      在这种情况下,`ENTRYPOINT` 定义的命令将始终启动 nginx,并且无法被用户在运行容器时指定的命令覆盖。

  3. 两者的组合
    • 如果在 Dockerfile 中同时使用 CMDENTRYPOINT,则 ENTRYPOINT 会作为主要执行命令,而 CMD 会作为默认参数传递给 ENTRYPOINT
    • 例如:
      ENTRYPOINT ["nginx"]
      CMD ["-g", "daemon off;"]
      
      Docker

      在这种情况下,`ENTRYPOINT` 定义了容器启动时执行的命令 `nginx`,而 `CMD` 提供了默认参数 `-g daemon off;`。如果用户在运行容器时提供其他参数,那么这些参数将替代 `CMD` 中的内容并传递给 `ENTRYPOINT`。

  4. 区别总结
    • CMD:为容器提供默认的命令和参数,但可以被用户覆盖。如果没有提供其他命令,CMD 会生效。
    • ENTRYPOINT:为容器指定一个“固定”的命令,且不会被用户指定的命令覆盖。即使用户传递了其他命令,ENTRYPOINT 会始终执行。

总结CMD 提供了容器的默认命令和参数,而 ENTRYPOINT 定义了容器启动时始终执行的命令。二者可以结合使用,ENTRYPOINT 用作主要命令,CMD 用作默认参数。

发表评论

后才能评论