docker 系列之 Dockerfile 文件里 cmd命令与entrypoint命令区别

news2024/11/24 11:08:41

文章目录

    • 一、cmd:
      • 用法1:带有中括号的形式
      • 用法2:shell form,即没有中括号的形式
    • 二、entrypoint:
      • 第一种:命令行模式,也就是带中括号
      • 第二种:shell模式
    • 三、总结:

一、cmd:

cmd给出的是一个容器的默认的可执行体。也就是容器启动以后,默认的执行的命令。重点就是这个“默认”。意味着,如果docker run没有指定任何的执行命令或者dockerfile里面也没有entrypoint,那么,就会使用cmd指定的默认的执行命令执行。同时也从侧面说明了entrypoint的含义,它才是真正的容器启动以后要执行命令。

The CMD instruction has three forms:
 
CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)

用法1:带有中括号的形式

带有中括号的形式。这时,命令没有再任何shell终端环境下,如果我们要执行shell,必须把shell加入到中括号的参数中。这种用法就像一个c语言的exec函数,意思是我们要执行一个进程。如果采用非shell的方法,那么上面的例子要修改为:

FROM centos
 
CMD ["/bin/bash", "-c", "echo 'hello cmd!'"]

注意:采用中括号形式,那么第一个参数必须是命令的全路径才行。而且,一个dockerfile至多只能有一个cmd,如果有多个,只有最后一个生效。官网推荐采用这种方法。

当然,以上都是体现了cmd的“默认”行为。如果我们在run时指定了命令或者有entrypoint,那么cmd就会被覆盖。仍然是上面的image。run命令变了:
在这里插入图片描述
可以看到,最终容器里面执行的是run命令后面的命令,而不是cmd里面定义的。

用法2:shell form,即没有中括号的形式

那么命令command默认是在“/bin/sh -c”下执行的。比如下面的dockerfile:

FROM centos
 
CMD echo "hello cmd!"

运行:
在这里插入图片描述

注意:采用中括号形式,那么第一个参数必须是命令的全路径才行。而且,一个dockerfile至多只能有一个cmd,如果有多个,只有最后一个生效。

二、entrypoint:

entrypoint才是正统地用于定义容器启动以后的执行体的,其实我们从名字也可以理解,这个是容器的“入口”。
有两种用法:命令行和shell。

ENTRYPOINT has two forms:
 
ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred)
ENTRYPOINT command param1 param2 (shell form)

第一种:命令行模式,也就是带中括号

和cmd的中括号形式是一致的,但是这里貌似是在shell的环境下执行的,与cmd有区别。如果run命令后面有东西,那么后面的全部都会作为entrypoint的参数。如果run后面没有额外的东西,但是cmd有,那么cmd的全部内容会作为entrypoint的参数,这同时是cmd的第二种用法。这也是网上说的entrypoint不会被覆盖。当然如果要在run里面覆盖,也是有办法的,使用–entrypoint即可。

例如:
dockerfile为:

FROM centos
 
CMD ["p in cmd"]
ENTRYPOINT ["echo"]

如果run不带参数:
在这里插入图片描述
如果run带参数:
在这里插入图片描述
而且,确实entrypoint的中括号形式下,command是在shell环境下运行的,否则这里的echo是无法被执行的。

第二种:shell模式

在这种模式下,任何run和cmd的参数都无法被传入到entrypoint里。官网推荐第一种用法。
例如:

FROM centos
 
CMD ["p in cmd"]
ENTRYPOINT echo

在这里插入图片描述

三、总结:

一般还是会用entrypoint的中括号形式作为docker 容器启动以后的默认执行命令,里面放的是不变的部分,可变部分比如命令参数可以使用cmd的形式提供默认版本,也就是run里面没有任何参数时使用的默认参数。如果我们想用默认参数,就直接run,否则想用其他参数,就run 里面加参数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/514302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《人月神话》纪念典藏版撤下了以前的宣传语

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>> 《人月神话》作者Frederick Phillips Brooks Jr. 于2022年11月17日逝世。 清华大学出版社近期将发行《人月神话》纪念典藏版。 新版的封底如下,宣传语更换成了…

CleanMyMac X4.13.2.dmg最新中文版下载

它是Mac上一款美观易用的系统优化清理工具,也是小编刚开始用Mac时的装机必备。它能够清理系统垃圾,提升电脑的运行速度,卸载许久不用的软件,使其变得如新机一般流畅。 CleanMyMac X是一款专业的Mac清理软件,可智能清理…

al智能改写工具-ai自动生成文章软件

随着互联网的发展,文章编辑在不断地向自动化、高效化方向进行转变,一款名叫“改稿神器”的工具应运而生。它可以帮助我们快速实现全自动批量改稿,做到没有错别字,自动优化语法,自动插入图片,严格按照标准的…

【腾讯云FinOps Crane 集训营】初识 FinOps Crane

前言: 有幸参加了腾讯云Finops Crane 集训营,学到了很多东西,现在将内容分享给大家。 Finops Crane :是一个基于 FinOps 的云资源分析与成本优化平台。 它的目标是希望在保证客户应用运行质量的前提下,实现极致的降本。…

web前端面试题汇总大全 -- 持续更新!

文章目录 一、html 系列 ⭐⭐⭐⭐⭐1、H5新增特性和css3新增特性? 二、css 系列 ⭐⭐⭐⭐⭐1、BFC的理解?2、说说你对盒模型的理解?3、如何实现元素⽔平垂直居中?4、CSS如何画⼀个三⻆形?原理是什么?5、说说…

二分查找基础篇-JAVA

文章目录 前言 大家好,我是最爱吃兽奶,这篇博客给大家介绍一下二分查找,我们先从最基本的开始讲解,再慢慢深入,把优化和变形也和大家说一下,那么,跟着我的步伐,我们一起去看看吧! 一、什么是二分查找? 二分查找(Binary Search)也称作折半查找 二分查找的效率很高,每查找一次…

Adam优化器及其变种的原理

本文将从SGD开始介绍Adam优化器的原理以及其变种的提出背景。 1、SGD的原理 SGD(随机梯度下降法)是基于最速梯度下降法的原理,假设我们存在损失函数,其中是要学习参数,定义如下的优化路径,使得损失函数值最…

Ray使用案例

Ray Use Cases Ray用例 本页索引了用于扩展ML的常见Ray用例。它包含了对博客、例子和教程的突出引用,也位于Ray文档的其他地方。 大型语言模型和生成型人工智能 大型语言模型(LLMs)和生成性人工智能正在迅速改变行业,并以惊人的速度要求计算。Ray为这些模型的扩展提供了…

我让ChatGPT用CSS3画一个皮卡丘,还是自己画的可爱

突然想到了小时候看过的动画片《皮卡丘》,于是突然就想,ChatGPT肯定也看过,他哪有不知道的东西啊,于是就想着让他帮我画一个,他画出来之后,我笑了,这啥玩意儿啊。 目录 一、第一次尝试让ChatGP…

智安网络|怎么预防大大小小的网络入侵及信息泄露?五招值得收藏

网络安全是一个涵盖广泛、变幻多端的领域。网络风险防范需要多种措施,从教育人员如何正确处理机密信息到定期检查系统的安全性。 在现代网络环境下,网络安全成为防护重点,网络环境下出现的安全隐患可能会直接影响业务,甚至生命财…

【fiddler+burp+雷神模拟器联动抓包】

0x00 常用抓包工具 常用的抓包工具​有fiddler、wireshark、httpwatch、 firebug、F12/等。抓包抓的是协议,fiddler抓的是HTTP、HTTPS协议,wireshark抓的是其他协议。fiddler、wireshark可以修改接口的参数和返回值,常用的F12调试工具只可以…

npm 知识点

1 ~会匹配最近的小版本依赖包,比如~1.1.3会匹配所有1.1.x版本,但是不包括1.2.0 ^会匹配最新的大版本依赖包,比如^1.3.4会匹配所有1.x.x的包,包括1.3.4,但是不包括2.0.0 *会匹配最新版本 2 ant-design/pro-table 前面…

EndNote X9 引用参考 单击文献编号,不能跳转到文尾文献列表处,咋解决?文献编号 不能跳转 ,怎么办?

文章目录 1 正常情况下 引用文献编号 是可以跳转的2 问题分析3 解决方法4 EndNote X9 插入参考文献常见问题总结5 EndNote X9 快速上手教程(毕业论文参考文献管理器) 1 正常情况下 引用文献编号 是可以跳转的 正确的插入文献后, 正常情况下&a…

公告 | FISCO BCOS v3.3.0发布,新增块内分片技术,单链性能突破10万TPS

FISCO BCOS开源社区一贯秉承开源、开放、联合共建的原则,致力于链接社区力量将FISCO BCOS打造成更加完美的区块链底层平台。 在社区通力协作下,FISCO BCOS v3.3.0已经发布,块内分片作为本次更新的核心亮点,实现了应用间交易执行的…

PyMuPDF pdf神奇处理工具

可将pdf转图片,图片转pdf,可拼接pdf,可提取固定的内容。 详细参考下面文章: PyMuPDF关键字标注:https://www.cnpython.com/qa/1436855 PyMuPDF去水印:https://sunnysab.cn/2022/06/29/Clean-Watermarks-…

BlockingQueue(阻塞队列)基本使用指南

概述 BlockingQueue 是 java.util.concurrent 包提供的用于解决并发生产者 - 消费者问题的最有用的类。 BlockingQueue 的特性是在任意时刻只有一个线程可以进行 take 或者 put 操作,并且 BlockingQueue 提供了超时 return null 的机制,在许多生产场景…

哪些行业适合开发微信小程序?

随着电子商务的进一步发展,很多行业都开始开发自己的系统软件,企图通过线上线下结合的方式来达到更好的宣传效果,拓客引流。微信小程序凭借成本低、使用方便等优点成为很多商家的首选。那么究竟哪些行业适合开发微信小程序呢? …

springboot项目,localhost:port 可以访问,但是外网IP:port不行

springboot 项目启动后,localhost:port 可以访问,但是外网IP:port不行 现象原因及解决方法解决方法:规则1:规则2:规则3: 现象 springboot项目,localhost:port 可以访问,但是外网IP:…

Java多线程基础-9:代码案例之阻塞队列

阻塞队列是一种特殊的队列,带有“阻塞特性”,也遵守队列 “先进先出” 的原则。阻塞队列是一种线程安全的数据结构,并且具有以下特性: 当队列满时,继续入队列就会阻塞,直到有其他线程从队列中取走元素。当…

协程Flow原理

什么是Flow Flow直译过来就是“流”的意思,也就是将我们我们任务如同水流一样一步一步分割做处理。想象一下,现在有一个任务需要从山里取水来用你需要怎么做? 扛上扁担走几十里山路把水挑回来。简单粗暴,但是有可能当你走了几十…