Dockerfile中的CMD vs ENTRYPOINT指令差异

Dockerfile 中的 CMDENTRYPOINT 指令都是用来指定容器启动时执行的命令和参数的


指定作用

  1. CMD:

    • CMD 是 Dockerfile 中的默认执行指令,如果用户没有指定任何命令,Docker 将使用 CMD 指定的命令。
    • CMD 可以被用户在启动容器时通过命令行覆盖
    • 它可以用来提供容器的默认行为,比如提供一个交互式的shell。
    • 一个 Dockerfile 中可以有多个 CMD 指令,但只有最后一个会生效
  2. ENTRYPOINT:

    • ENTRYPOINT 用来指定容器启动时要运行的可执行文件或脚本
    • ENTRYPOINT 指令是不可被覆盖的,这意味着用户不能在启动容器时通过命令行替换它,但可以通过添加额外的参数来修改它的行为。
    • ENTRYPOINT 可以与 CMD 一起使用,CMD 中的参数会被当作 ENTRYPOINT 的参数。
    • 一个 Dockerfile 中可以有多个 ENTRYPOINT 指令,但同样只有最后一个会生效

使用场景

  • 如果你想创建一个容器,当用户没有指定命令时默认执行一个脚本,你可以使用 CMD 来指定这个脚本。
  • 如果你想创建一个容器,无论用户是否指定命令,容器总是执行同一个程序或脚本,并且可以接受一些参数,你可以使用 ENTRYPOINT 来指定这个程序或脚本,然后使用 CMD 来提供默认参数。
1
2
3
4
5
# 使用 ENTRYPOINT 指定要执行的脚本或程序
ENTRYPOINT ["executable", "param1"]

# 使用 CMD 提供默认参数
CMD ["default_param1", "default_param2"]

在这个例子中,如果用户启动容器时没有指定任何参数,将会执行 executable 程序,并且 param1 被设置为 default_param1default_param2 作为第二个参数。如果用户在启动容器时指定了参数,这些参数将替换 CMD 中的默认参数。记住,ENTRYPOINTCMD 可以相互配合,提供灵活的容器启动行为。