docker容器中的EntryPoint和CMD命令区别
entrypoint设置容器的入口程序,就是容器启动时执行的程序,docker run中最后的命令将作为参数传给入口程序,它有两种格式exec和shell,它们之间区别在于指定的命令是否在shell中运行,其中shell底层使用/bin/sh -c COMMAND运行,就是说主进程shell进程,后面正在执行命令的进程是在shell进程中启动,这时shell进程往往是多余的,因此通常采用exec形式ENTRYPOINT指令,格式如下:
Shell 格式
<instruction> <command>
示例如下:
ENTRYPOINT echo "Hello, $name"
将输出:
Hello, Cloud Man
此时入口程序不能接受信号量,也就是忽略docker run的参数和cmd指令的参数,如果有多个entrypoint,只有最后一个生效。run是编译镜像时执行的脚本和程序,编译完成run指令生命周期结束,一般用shell命令。而cmd和entrypoint一般用exec指令,格式如下
Exec 格式
<instruction> ["executable", "param1", "param2", ...]
示例比如
CMD ["java","-jar","/root/a.jar","/root/aa.json"]//这个是exec
如果同时出现cmd和entrypoint,cmd作为参数传递给entrypoint指令。
ENTRYPOINT ["/bin/echo", "Hello, $name"]
运行容器将输出:
Hello, $name
注意环境变量“name”没有被替换。
如果希望使用环境变量,照如下修改
ENV name Cloud Man
ENTRYPOINT ["/bin/sh", "-c", "echo Hello, $name"]
Dockerfile中ENTRYPOINT和CMD的区别 Dockerfile中,环境参数写在ENTRYPOINT和CMD是有区别的 写在ENTRYPOINT中,其效果是追加的方式, 写在CMD中,其效果是覆盖的方式, 理解起来很困难,下面通过实例来解析这个区别 假如项目的application.yml的默认配置为spring.profiles.active=native 如Dockerfile文件如下: FROM java:8 # ARG JAR_FILE # ARG LIB_FILE VOLUME /tmp ADD lib lib ADD config-center-1.0.jar /app.jar # ADD ${LIB_FILE} /lib ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Duser.timezone=GMT+08","-Dspring.profiles.active=dev","-Deureka.instance.ipAddress=172.16.11.76","-Dserver.port=8889"] CMD ["-Xms512m","-Xmx512m","-jar", "/app.jar"] 参数是写在ENTRYPOINT的,其运行效果就是追加的方式,效果为spring.profiles.active=dev,native,这样两个环境参数都激活了 若修改为: FROM java:8 # ARG JAR_FILE # ARG LIB_FILE VOLUME /tmp ADD lib lib ADD config-center-1.0.jar /app.jar # ADD ${LIB_FILE} /lib CMD ["java","-Djava.security.egd=file:/dev/./urandom","-Duser.timezone=GMT+08","-Dspring.profiles.active=dev","-Deureka.instance.ipAddress=172.16.11.76","-Dserver.port=8889","-Xms512m","-Xmx512m","-jar", "/app.jar"] 参数写在CMD中,所有参数是覆盖的效果,效果为spring.profiles.active=dev
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2018-06-07 oracle中for循环