Dockerfile中的CMD vs ENTRYPOINT指令差异
Dockerfile 中的 CMD 和 ENTRYPOINT 指令都是用来指定容器启动时执行的命令和参数的
指定作用
CMD:
CMD是 Dockerfile 中的默认执行指令,如果用户没有指定任何命令,Docker 将使用CMD指定的命令。CMD可以被用户在启动容器时通过命令行覆盖。- 它可以用来提供容器的默认行为,比如提供一个交互式的shell。
- 一个 Dockerfile 中可以有多个
CMD指令,但只有最后一个会生效。
ENTRYPOINT:
ENTRYPOINT用来指定容器启动时要运行的可执行文件或脚本。ENTRYPOINT指令是不可被覆盖的,这意味着用户不能在启动容器时通过命令行替换它,但可以通过添加额外的参数来修改它的行为。ENTRYPOINT可以与CMD一起使用,CMD中的参数会被当作ENTRYPOINT的参数。- 一个 Dockerfile 中可以有多个
ENTRYPOINT指令,但同样只有最后一个会生效。
使用场景
- 如果你想创建一个容器,当用户没有指定命令时默认执行一个脚本,你可以使用
CMD来指定这个脚本。 - 如果你想创建一个容器,无论用户是否指定命令,容器总是执行同一个程序或脚本,并且可以接受一些参数,你可以使用
ENTRYPOINT来指定这个程序或脚本,然后使用CMD来提供默认参数。
1 | # 使用 ENTRYPOINT 指定要执行的脚本或程序 |
在这个例子中,如果用户启动容器时没有指定任何参数,将会执行 executable 程序,并且 param1 被设置为 default_param1,default_param2 作为第二个参数。如果用户在启动容器时指定了参数,这些参数将替换 CMD 中的默认参数。记住,ENTRYPOINT 和 CMD 可以相互配合,提供灵活的容器启动行为。