docker的run,cmd,entrypoint分析和对比

news2024/12/25 23:41:03

写在前面

本文一起看下Dockerfile中经常用到的几个类似命令,RUN,CMD,ENTRYPOINT。

1:容器是怎么来的?

想要有容器我们就必须先创建镜像,而想要有镜像,我们则必须写一个用来描述想要创建的镜像的文件,这个文件我们一般叫做Dockerfile(非强制),则容器怎么来的就如下图:

在这里插入图片描述

经过上图的过程1我们就有了镜像,经过过程2我们就有了容器了,知道了这个过程,我们就可以来正式开始分析RUN,CMD,ENTRYPOINT命令了。

2:RUN

在这里插入图片描述

RUN命令是在上图过程1中执行的,如下的Dockerfile:

FROM busybox
WORKDIR /var
RUN pwd

则执行docker build时就会输出pwd的结果:

dongyunqi@dongyunqi-virtual-machine:~$ docker build -t test-push-dockerhub:0.1 -f howPwd.txt helloworld-app/
Sending build context to Docker daemon  8.738kB
Step 1/3 : FROM busybox
 ---> 827365c7baf1
Step 2/3 : WORKDIR /var
    /var # 这里就是pwd的输出,其实输出的就是工作目录,不过输出的到底是什么此时不重要,我们主要是验证pwd在docker build时执行了
Step 3/3 : RUN pwd
 ---> Using cache
 ---> 7975c01019bd
Successfully built 7975c01019bd

3:CMD

在容器启动时执行的命令,一般用来启动应用等,如下Dockerfile:

dongyunqi@dongyunqi-virtual-machine:~/test$ cat testEntrypoint.txt 
FROM busybox
CMD echo "hello world"

构建:

dongyunqi@dongyunqi-virtual-machine:~/test$ docker build -t test-entrypoint:v0.1 -f testEntrypoint.txt .
...

运行容器:

dongyunqi@dongyunqi-virtual-machine:~/test$ docker run --rm test-entrypoint:v0.1
hello world

可以看到正常输出了。另外如果是有多个CMD只会保留最后一个,如下:

FROM busybox
CMD echo "hello world"
CMD echo "hello world1111"

测试:

dongyunqi@dongyunqi-virtual-machine:~/test$ docker build -t test_entrypoint:v0.1 -f testEntrypoint.txt .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM busybox
 ---> 827365c7baf1
Step 2/3 : CMD echo "hello world"
 ---> Using cache
 ---> c596d2e7bfb5
Step 3/3 : CMD echo "hello world1111"
 ---> Running in 9369670af208
Removing intermediate container 9369670af208
 ---> d7d08688d050
Successfully built d7d08688d050
Successfully tagged test_entrypoint:v0.1
dongyunqi@dongyunqi-virtual-machine:~/test$ docker run --rm test_entrypoint:v0.1
hello world1111
dongyunqi@dongyunqi-virtual-machine:~/test$

可以看到只输出了hello world1111。以上的是shell格式,我们也可以用Exec 格式,如下:

dongyunqi@dongyunqi-virtual-machine:~/test$ cat testEntrypoint.txt 
FROM busybox
CMD ["/bin/echo", "Hello world222"]  

测试:

dongyunqi@dongyunqi-virtual-machine:~/test$ docker build -t test_entrypoint:v0.1 -f testEntrypoint.txt .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM busybox
 ---> 827365c7baf1
Step 2/2 : CMD ["/bin/echo", "Hello world222"]
 ---> Running in d69c8fdbb1a4
Removing intermediate container d69c8fdbb1a4
 ---> 5e0920f3e988
Successfully built 5e0920f3e988
Successfully tagged test_entrypoint:v0.1
dongyunqi@dongyunqi-virtual-machine:~/test$ docker run --rm test_entrypoint:v0.1
Hello world222

可以看到正常输出了Hello world222。但是如果是在docker run时指定了启动命令,则会覆盖CMD,如下:

dongyunqi@dongyunqi-virtual-machine:~/test$ docker run --rm test_entrypoint:v0.1 /bin/echo "hey man!"
hey man!

4:ENTRYPOINT

ENTRYPOINT在Dockerfile中的表现和CMD是一样的,但是ENTRYPOINT不会被docker run中指定的命令覆盖,但是也分为两种情况,如果是使用shell格式的话则docker run中指定的命令将会被忽略,如下:

dongyunqi@dongyunqi-virtual-machine:~/test$ cat testEntrypoint.txt 
FROM busybox
ENTRYPOINT echo "Hello world44444"  
dongyunqi@dongyunqi-virtual-machine:~/test$ docker build -t test_entrypoint:v0.1 -f testEntrypoint.txt .
Sending build context to Docker daemon  2.048kB
...
dongyunqi@dongyunqi-virtual-machine:~/test$ docker run --rm test_entrypoint:v0.1 11111111111/bin/echo "hey man!"
Hello world44444

如果是Exec格式的话则会被当做参数追加到后面,如下:

dongyunqi@dongyunqi-virtual-machine:~/test$ cat testEntrypoint.txt 
FROM busybox
ENTRYPOINT ["echo", "Hello world555"]  
dongyunqi@dongyunqi-virtual-machine:~/test$ docker build -t test_entrypoint:v0.1 -f testEntrypoint.txt .
Sending build context to Docker daemon  2.048kB
...
dongyunqi@dongyunqi-virtual-machine:~/test$ docker run --rm test_entrypoint:v0.1 11111111111/bin/echo "hey man!"
Hello world555 11111111111/bin/echo hey man!

相当于是在Dockerfile中写的是ENTRYPOINT ["echo", "Hello world555", "11111111111/bin/echo", "hey man!"]

4:比较

RUN:在docker build生成镜像时执行。
CMD:在docker run时执行,但其会被docker run中指定的命令覆盖
ENTRYPOINT:在docker run时执行,但不会被docker run中指定的命令覆盖,如果是ENTRYPOINT使用shell格式则会忽略,使用Exec格式则会作为参数追加后执行

所以RUN比较独立,CMD和ENTRYPOINT几乎一样,只是在docker run指定指定命令时的表现不同。

写在后面

参考文章列表:

docker精简入门(五)run&cmd&enterpoint区别 。

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

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

相关文章

Struts2基本架构

Struts2基本架构1、Struts2执行流程2、web.xml配置3、Action控制器3.1、核心控制器3.2、业务控制器4、Result配置5、struts.xml核心配置5.1、constant元素5.2、package元素5.3、配置文件加载顺序1、Struts2执行流程 如下例子: 执行流程如下: 浏览器将请…

Python Flask开发笔记

Python Flask开发笔记一、创建flask项目1.开发环境:2.安装Flask3.使用pycharm,创建flask项目二、flask介绍1.介绍初始flask主程序接口文件2.Flask() 类1.Flask参数解释0.sys.modules用于缓存程序导入模块名1.import_name 主程序模块名2.static_url_path …

IconJar - Mac 上的一款多功能图标素材管理工具

IconJar - Mac 上的一款多功能图标素材管理工具 IconJar 是一个多功能的图标管理工具,由世界各地的设计师和开发人员使用。在一个应用程序中搜索、组织、预览和检索图标,而不是创建大量的文件夹来存储你的收藏。这款应用针对黑暗模式进行了优化&#xff…

2022年自动化测试工具汇总——实用的功能测试工具篇

如今,UI自动化测试工具就和雨后春笋般,层出不穷。由于每种工具都有自己的重点和策略,所以总是让人无从下手。今天我们来对比现在使用比较广泛的几个UI自动化测试工具,来看看他们之间的优缺点。 首先,我们先简单介绍一下…

4.6.4、边界网关 BGP 的基本工作原理

1、力求寻找较好的路由 因特网采用分层次的路由选择协议 内部网关协议(例如:路由信息协议 RIP 或开放最短路径优先 OSPF) 它们都是设法使分组在一个自治系统内尽可能有效地从源网络传输到目的网络无需考虑自治系统外部其他方面的策略 外部…

内网渗透-src挖掘-外网打点到内网渗透-3层内网渗透测试记录-2023年1月

1、通过信息搜集,发现目标有一个外网访问的通达OA系统 2、通达OA的漏洞是非常多的,这里利用大佬写好的通达OA一键getshell工具 成功获取webshell 3、连接webshell,上传cs马儿到服务器 4、执行获取主机权限 成功上线 5、通过Ladon插件发…

百分之80新手都不知道,SEO搜索引擎优化【sitemap网站地图 配置】

Sitemap 可方便网站管理员通知搜索引擎他们网站上有哪些可供抓取的网页。最简单的 Sitemap 形式,就是XML 文件,在其中列出网站中的网址以及关于每个网址的其他元数据(上次更新的时间、更改的频率以及相对于网站上其他网址的重要程度为何等&am…

浅析oauth2.0及应用场景

讲OAuth2.0之前,我们先理解一个概念,授权用户和资源权限的概念授权用户:用户访问某个应用系统,该应用系统请求认证中心授权以获取这个登录用户的信息,但并没有得到这个用户的密码,这个就是OAuth2.0实现的要…

N个点,求距离最近的两个点---分治策略(1)

设平面有n个点的直角坐标是,i 1, 2, ...,n,求距离最近的2个点,距离计算: 首先这个问题是可以使用蛮力算法,一共n(n-1)/2个点对,每对点对计算需要常数的时间,蛮力算法需要的时间。 由于点对有二维的空间坐标&#xf…

(三十)Vue之回顾本地存储webStorage

文章目录webStorageLocalStoragesessionStorage改造TodoList案例为本地存储Vue学习目录 上一篇:(二十九)Vue之组件化编码流程 下一篇:(三十一)Vue之自定义事件 webStorage 使用HTML5可以在本地存储用户…

Python基础(二十二):文件操作

文章目录 文件操作 一、文件操作的作用 二、文件的基本操作 1、文件操作步骤

同时开启的revit模型和navisworks如何同步呢?

一、 Navisworks与Revit同步问题 同时开启的revit模型和同时开启的navisworks如何同步呢? 1.如图1所示打开了一个revit模型 将模型保存在指定的路径上,然后通过直接拖拽的方式在navisworks manage打开模型文件,过程中会出现读条状态,如图2所…

【MySQL进阶教程】 索引使用与设计原则

前言 本文为 【MySQL进阶教程】 索引使用与设计原则 相关知识,下边将对索引的使用(包括:验证索引效率,最左前缀法则,范围查询,索引失效情况,SQL提示,覆盖索引,前缀索引&a…

Struts2获取表单数据

Struts2获取表单数据Struts2获取表单数据1、原始Servlet方法2、属性封装3、表达式封装4、模型驱动封装Struts2获取表单数据 在Struts2中获取表单数据或提交路径的参数值的方式有4种。如下: 原始Servlet方法属性封装表达式封装模型驱动封装 1、原始Servlet方法 该…

文章书写方法

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

Python爬虫 xpath解析基础

今天继续给大家介绍Python爬虫相关知识,本文主要内容是Python爬虫 xpath解析基础。 一、xpath简介 xpath,即XML Path Language,是一种用来确定XML文档中某部分位置的语言,Xpath以XML为基础,可以提供用户在数据结构树…

8、可观测性--链路追踪

文章目录链路追踪服务之间的依赖Span 的构成Span 之间关系链路图链路追踪与 Dapper链路追踪的作用链路查询性能分析拓扑图依赖关系跨应用/语言采样率链路追踪 首先,我来带你了解一下什么是链路追踪? 服务之间的依赖 在前言中介绍了数据的来源&#xf…

运营|为什么需要配置https?

什么是HTTPS、它带来了什么? 从名字来看,它比http多了一个“s”,这个“s”表示安全。目的在于提供更安全的HTTP通道,即HTTP下加入SSL层并且加密。太详细的我就不再这里说了,再说我就要抄百度百科了。简单来说,不同于HTTP使用80端口,HTTPS使用443端口,HTTPS还需要一个付…

【手写 Vue2.x 源码】第七篇 - 阶段性梳理

一,前言 上篇,介绍了 Vue 数据初始化流程中,Vue 实例上数据代理的实现,核心思路如下: 将 data 暴露在 vm._data 实例属性上利用 Object.defineProperty 将 vm.xxx 操作代理到 vm._data 上 本篇,对当前版本的数据劫持…

[VP]河南第十三届ICPC大学生程序竞赛 J.甜甜圈

前言 传送门 : https://ac.nowcoder.com/acm/contest/17148/J 题意 : 给定两个甜甜圈堆 , 每次只能吃所有中最甜的那一个 , 否则的话就移动 询问最小的移动步骤 思路 : 很明确的一个目标 , 寻找当前最大值并且求出距离 那么我们考虑将两个甜甜圈堆进行合并 , 使得变成一个…