当前位置: 首页 > news >正文

Dockerfile中的RUN、CMD、ENTRYPOINT指令区别

  • RUN在构建过程中在镜像中执行命令。
  • CMD容器创建时的默认命令。(可以被覆盖)
  • ENTRYPOINT容器创建时的主要命令。(不可被覆盖)

指令介绍

1.RUN

在构建过程中在镜像中执行命令,是在 docker build中执行

2.CMD

作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。 在docker run 时运行。

注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

CMD <shell 命令> 
CMD ["<可执行文件或命令>","<param1>","<param2>",...] 
CMD ["<param1>","<param2>",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

3.ENTRYPOINT

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。

优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。

注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

CMD和ENTRYPOINT区别以及搭配使用

ENTRYPOINT 指令和 CMD 指令的工作方式类似,但它们之间有一个关键区别:ENTRYPOINT 指定的程序不会被 docker run 命令行参数覆盖,而命令行参数会被当作参数传递给 ENTRYPOINT 指定的程序

理解示例

1. Dockerfile 示例

假设我们在 Dockerfile 中使用 ENTRYPOINT 指令:

FROM ubuntu
ENTRYPOINT ["echo", "Hello"]

在这个 Dockerfile 中,echoENTRYPOINT 指定的程序,而 "Hello" 是它的默认参数。

2. 运行容器时传递参数

当你使用 docker run 运行镜像时,如果你在命令行中传递了额外的参数,这些参数会被附加到 ENTRYPOINT 指定的程序之后,作为它的参数。

例如:

docker run my-ubuntu World

这个命令不会覆盖 ENTRYPOINT,而是将 World 作为参数传递给 echo,最终执行的命令是:

echo Hello World

输出结果:

Hello World

在这个例子中,docker run my-ubuntu World 将命令行参数 World 传递给了 echo 命令,使得最终的执行效果是输出 Hello World

3. 与 CMD 的区别

如果你在 Dockerfile 中使用的是 CMD 而不是 ENTRYPOINT,那么 docker run 中的参数会完全覆盖 CMD 指定的默认命令。

例如:

FROM ubuntu
CMD ["echo", "Hello"]

运行 docker run my-ubuntu World 时,World 会覆盖 CMD 中的 echo Hello,最终执行的命令是:

World

这会导致 docker: Error response from daemon: OCI runtime create failed 的错误,因为 World 不是有效的命令。

4. 结合 CMDENTRYPOINT

你还可以结合 ENTRYPOINTCMD 来提供更灵活的默认行为。例如:

FROM ubuntu
ENTRYPOINT ["echo"]
CMD ["Hello"]

在这种情况下,ENTRYPOINT 始终会执行 echo,而 CMD 中的 "Hello" 是默认参数。如果你运行:

docker run my-ubuntu

输出结果是:

Hello

但是,如果你运行:

docker run my-ubuntu World

这时,World 会覆盖 CMD"Hello",并作为参数传递给 echo,输出:

World

总结

  • ENTRYPOINT 不会被 docker run 命令行参数覆盖,命令行参数会传递给 ENTRYPOINT 指定的程序。
  • CMD 可以被 docker run 覆盖,且默认参数会在没有额外命令行参数时生效。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PCL-统计滤波
  • 十、组合模式
  • 计算机毕业设计选题推荐-自驾游攻略管理系统-Java/Python项目实战
  • 让PPT动起来:用python-pptx轻松添加动画效果
  • TwinCAT3 实时核中ADS实现C++ server、clinet数据传输
  • 车载以太网之SOME/IP
  • 【达梦数据库】误删数据库目录问题复现解决方式
  • JDK 8 新增特性:Lambda 表达式
  • 亚信安全出席第五届国际反病毒大会 探究AI现代网络勒索治理
  • 骨传导耳机哪个品牌好用?精选五大高能骨传导耳机分享!
  • Learn OpenGL In Qt之着色器
  • 深度学习算法:现代人工智能的核心驱动
  • STL集合
  • 如何远程实时监控员工的电脑屏幕?远程桌面监控的五个可实现方法分享
  • soup.find(‘div‘)获取的数据长度为3,为什么1和3都是空的?
  • CentOS 7 防火墙操作
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • Javascript编码规范
  • Meteor的表单提交:Form
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • MQ框架的比较
  • React Transition Group -- Transition 组件
  • React-flux杂记
  • windows-nginx-https-本地配置
  • 阿里云购买磁盘后挂载
  • 从零开始在ubuntu上搭建node开发环境
  • 配置 PM2 实现代码自动发布
  • 王永庆:技术创新改变教育未来
  • 物联网链路协议
  • 线上 python http server profile 实践
  • 学习使用ExpressJS 4.0中的新Router
  •  一套莫尔斯电报听写、翻译系统
  • 在weex里面使用chart图表
  • 正则表达式小结
  • UI设计初学者应该如何入门?
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • ​渐进式Web应用PWA的未来
  • #07【面试问题整理】嵌入式软件工程师
  • #etcd#安装时出错
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (接口封装)
  • (理论篇)httpmoudle和httphandler一览
  • (十三)Maven插件解析运行机制
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (一)Neo4j下载安装以及初次使用
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)Sublime Text3配置Lua运行环境