dockerfile cmd vs entrypoint
在 Dockerfile 中,CMD
和 ENTRYPOINT
都用于定义容器启动时执行的命令,但它们的作用和使用场景有所不同。
1. CMD
作用: 提供容器启动时的默认命令及其参数。
特点:
- 如果 Dockerfile 中有多个
CMD
,只有最后一个生效。 - 启动容器时,可以通过命令行参数覆盖
CMD
指定的命令。 - 通常用于设置默认命令,允许用户在启动容器时灵活替换。
- 如果 Dockerfile 中有多个
示例:
1
CMD ["echo", "Hello, World!"]
启动容器时,默认会输出 “Hello, World!”。如果用户指定了其他命令,如
docker run <image> echo "Hello, Docker!"
,则会覆盖CMD
,输出 “Hello, Docker!”。
2. ENTRYPOINT
作用: 定义容器启动时执行的主命令,通常不会被覆盖。
特点:
- 如果 Dockerfile 中有多个
ENTRYPOINT
,只有最后一个生效。 - 启动容器时,命令行参数会作为
ENTRYPOINT
的参数追加,而不是覆盖。 - 通常用于定义容器的主要执行逻辑,用户只能传递参数。
- 如果 Dockerfile 中有多个
示例:
1
ENTRYPOINT ["echo", "Hello"]
启动容器时,默认会输出 “Hello”。如果用户指定了参数,如
docker run <image> World
,则会输出 “Hello World”。
3. CMD
和 ENTRYPOINT
的组合使用
作用:
ENTRYPOINT
定义主命令,CMD
提供默认参数。特点:
- 启动容器时,命令行参数会覆盖
CMD
的默认参数,但不会覆盖ENTRYPOINT
。 - 这种组合常用于定义可配置的容器。
- 启动容器时,命令行参数会覆盖
示例:
1
2ENTRYPOINT ["echo"]
CMD ["Hello, World!"]启动容器时,默认会输出 “Hello, World!”。如果用户指定了参数,如
docker run <image> Hello, Docker!
,则会输出 “Hello, Docker!”。
4. 总结
CMD
: 提供默认命令,允许用户覆盖。ENTRYPOINT
: 定义主命令,用户只能传递参数(追加参数)。- 组合使用:
ENTRYPOINT
定义主命令,CMD
提供默认参数,用户可覆盖CMD
的参数。