cmd该清华镜像_Docker动手教程3.3:容器镜像构建2
内容摘要
- dockerfile 常用指令
- RUN/CMD/ENTRYPOINT区别
Dockerfile 常用指令
前面初步讲解了Dockerfile,这节详细介绍Dockerfile用到的指令和语法。
下面来看一个较为完整的Dockerfile,内容如下:
# dockerfile hahaFROM centosMAINTAINER docker-test@example.comWORKDIR /mydirRUN touch mytextCOPY test .ADD busybox-1_29_0.tar.gz .ENV VERSION "1.0.2"CMD echo "I am cmd"CMD echo $VERSIONENTRYPOINT sleep 1000000
先不解释上面命令的意义,运行该文件构建镜像。
在构建镜像前,先在根目录下创建 test 文件夹,在其下面创建Dockerfile,以及准备构建使用的test文件,使用Xftp将busybox的压缩包上传到test目录下。
具体操作见下面操作截图:
说明:busybox文件的压缩包自行在github上下载。
构建镜像,命令为:
docker build -t centos-with-busybox .
从上面 Step 信息可以看出,构建步骤是按照我们在Dockerfile中的命令先后顺序执行的,最后生成的镜像 SIZE 比基础镜像要多 9M。
运行容器,检查构建是否成功, 命令为:
docker run -d --name centos-with-busybox1 centos-with-busybox
进入容器可以看到当前目录为 mydir,而且里面包含 创建的文件以及拷贝进去的文件,busybox压缩包已经被解压。
使用docker history 指令查看刚才构建的镜像:
从红框中可以看到 dockerfile 文件中执行的操作步骤。
下面详细解释下 dockerfile 文件用到的命令:
FROM:表示基于什么基础镜像进行构建
MAINTAINER:构建者信息,说明是谁构建的
WORKDIR:指定后续执行步骤的工作目录,比如拷贝文件,创建文件操作在哪个目录下执行
RUN:在容器运行命令,比如创建文件 touch xxx.txt
COPY:拷贝数据,即将主机上的文件拷贝到容器中去
ADD:也是拷贝数据,不同的是,如果被拷贝文件是压缩文件,那么拷贝到容器后会自动解压缩
ENV:指定环境变量,该环境变量可以在Dockerfile文件中使用,同时在容器中也生效
CMD:容器启动时运行的命令
ENTRYPOINT:同CMD相似,但也有区别
RUN/CMD/ENTRYPOINT 区别
从上面可以看出 RUN/CMD/ENTRYPOINT 都可以运行命令,那它们的区别是什么呢?
RUN 和 CMD/ENTRYPOINT的区别比较清楚:RUN主要用于在容器安装软件,操作文件和文件夹等,CMD/ENTRYPOINT主要用于启动容器,但是有很大的差别。
下面通过实验逐步分析二者之不同:
修改 Dockerfile 文件,内容如下:
# dockerfile hahaFROM centosMAINTAINER docker-test@example.comWORKDIR /mydirRUN touch mytextCOPY test .ADD busybox-1_29_0.tar.gz .ENV VERSION "1.0.2"CMD echo "I am cmd"CMD echo $VERSION
按照上面步骤重新构建镜像并运行,命令为:
docker run -it --name centos-with-busybox centos-with-busybox
镜像构建就不展示截图,镜像名为:centos-with-busybox,创建的容器也使用这个名字。
可以看到容器运行结果为环境变量VERSION的版本信息,但是倒数第二行的CMD命令没有输出,说明只有最后一个CMD命令生效。
下面换个方式运行容器,在 docker run 后面指定运行参数:
命令为:
docker run -it --name centos-with-busybox centos-with-busybox /bin/bash
指定 /bin/bash 作为启动参数,发现没有输出环境变量VERSION的版本信息,说明CMD命令被 /bin/bash 取代了。
那么ENTRYPOINT会如何表现呢?
修改Dockerfile,内容如下:
# dockerfile hahaFROM centosMAINTAINER docker-test@example.comWORKDIR /mydirRUN touch mytextCOPY test .ADD busybox-1_29_0.tar.gz .ENV VERSION "1.0.2"CMD echo "I am cmd"CMD echo $VERSIONENTRYPOINT echo "I am entrypoint"
先不加参数运行容器,命令为:
docker run -it --name centos-with-busybox centos-with-busybox
可见打印信息和Dockerfile中规定的字符串一致。
带上参数运行:
docker run -it --name centos-with-busybox centos-with-busybox /bin/bash
和上面一致,仍旧打印出一样的字符串。
对于ENTRYPOINT而言,无论 docker run 是否带有执行命令,都会执行,而CMD则相反。
问题:如果先后出现两个ENTRYPOINT命令,那么先出现的会执行吗?
修改Dockerfile,内容如下:
# dockerfile hahaFROM centosMAINTAINER docker-test@example.comWORKDIR /mydirRUN touch mytextCOPY test .ADD busybox-1_29_0.tar.gz .ENV VERSION "1.0.2"CMD echo "I am cmd"CMD echo $VERSIONENTRYPOINT echo "I am entrypoint 1"ENTRYPOINT echo "I am entrypoint 2"
构建镜像,并启动容器,命令为:
docker run -it --name centos-with-busybox centos-with-busybox
只运行了第二个ENTRYPOINT指令,第一个被忽略。
在这点上,ENTRYPOINT和CMD一样,即如果有多条该命令,只会执行最后一条。
CMD和ENTRYPOINT的区别决定了二者使用上不同:
1、由于CMD命令可以被docker run的命令替换,因此它可以用来设置默认启动命令,如果用户不想使用默认命令,就可以在docker run指令中指定自己的容器启动命令;
2、ENTRYPOINT 是必须执行的命令,所以往往用来启动应用程序或者服务,设置容器启动命令最好使用ENTRYPOINT,不要使用CMD。
3、ENTRYPOINT可以和CMD结合起来使用,充分结合二者的优点,可以使容器启动更加方便。
下面显示下如何结合使用ENTRYPOINT和CMD两个命令:
修改Dockerfile,内容如下:
FROM centosMAINTAINER docker-test@example.comWORKDIR /mydirRUN touch mytextCOPY test .ADD busybox-1_29_0.tar.gz .ENV VERSION "1.0.2"ENTRYPOINT ["echo
cmd该清华镜像_Docker动手教程3.3:容器镜像构建2相关推荐
- docker ubuntu镜像_docker使用教程
上手步骤 安装docker-->普通用户加入docker用户组-->获取镜像-->基于镜像创建容器-->进入容器-->可以在容器里随意捯饬环境或者运行东西啦~ 安装doc ...
- centos7镜像加速_使用阿里云容器镜像服务托管私有Docker镜像
一个只用markdown语法编写文章的90后野路子Web架构师,每天都分享一些有用的知识点,欢迎关注- 前言 概述 本文主要讲解如何托管自己的Docker镜像到阿里云容器镜像服务ACR上,以及如何使用 ...
- docker 修改阿里镜像源_使用阿里云容器镜像服务托管私有Docker镜像
一个只用markdown语法编写文章的90后野路子Web架构师,每天都分享一些有用的知识点,欢迎关注- 前言 概述 本文主要讲解如何托管自己的Docker镜像到阿里云容器镜像服务ACR上,以及如何使用 ...
- 发布镜像到DockerHub和阿里云容器镜像服务
文章目录 一.发布镜像到DockerHub 1.拥有一个DockerHub的账号 2.在服务器上登录DockerHub账号 3.发布镜像 二.发布镜像到阿里云容器镜像服务 1.登录阿里云,进入容器镜像 ...
- java项目打镜像_docker通过dockerfile打java项目镜像
环境:centos7 思路:java -jar 启动的项目打包成docker images进行运行 创建dockerfile-->创建shell脚本-->打包images 1.docker ...
- 生产中的12种容器镜像扫描最佳实践
现在很多团队面临着这么一个挑战:如何在不减慢应用交付速度的情况下,管理好安全风险.有种方法可以解决该问题,就是采用安全的 DevOps 工作流程. 安全的DevOps(也称为DevSecOps)会在从 ...
- 让容器应用管理更快更安全,Dragonfly 发布 Nydus 容器镜像加速服务
镜像对容器部署的挑战 在容器的生产实践中,偏小的容器镜像能够很快地部署启动.当应用的镜像达到几个 GB 以上的时候,在节点上下载镜像通常会消耗大量的时间.Dragonfly 通过引入 P2P 网络有效 ...
- 如何构建尽可能小的容器镜像?
关注我们获得更多内容 这是Google Developer Advocate Sandeep Dinesh 关于如何充分利用Kubernetes环境的七部分视频和博客系列的第一部分. 主要讲保持容器镜 ...
- 什么是容器服务_【小牛云计算课堂】什么是容器镜像服务
容器镜像服务(Container Registry)提供安全的应用镜像托管能力,精确的镜像安全扫描功能,稳定的国内外镜像构建服务,便捷的镜像授权功能,方便用户进行镜像全生命周期管理.容器镜像服务简化了 ...
最新文章
- 2021全球数据中心市场预测:资本支出将增长10%
- How to become the truely yourself?
- JavaScript 世界万物诞生记
- 高级进阶:Azure DevOps搞定.NET Core编译版本号自增
- [转载] Python3网络爬虫
- pb graph鼠标移上显示数据_Plotly数据可视化:离线版、微软vscode版的Python的基本作图...
- 数组对象的过滤(取出一项中的某些字段)
- 怎么禁用计算机的可信执行,英特尔®融合安全和管理引擎、英特尔®服务器平台服务、英特尔®可信执行引擎和英特尔®主动管理技术咨询 (intela-sa-00185)...
- python数据分析-如何在业余时学数据分析?
- mysql ibatis 批量插入_ibatis 批量插入逻辑
- SpringBoot整合shiro的一个例子
- 怎么用几何画板作一些简单的图形
- 基于Multisim的555时基电路
- 使用ffmpeg打开ts格式视频文件
- express基本使用步骤
- 怎么搭建百度网盘目录搜索网站?网盘目录#百度网盘
- python爬虫之帅哥图片爬取
- 资深 iOS 开发工程师教你5 道题全面考察候选人
- the remote end hung up unexpectedly Everything up-to-date
- 将图片转成base64字符串并在JSP页面显示的Java代码
热门文章
- python什么模块动态调用链接库_python如何调用扩展模块
- 2021-05-10 矩阵AB和矩阵BA有什么联系?
- 【Ray Tracing in One Weekend 超详解】 光线追踪1-7 Dielectric 半径为负,实心球体镂空技巧...
- python中的re模块——正则表达式
- 使用css3实现瀑布流布局效果
- mui框架之a标签无法跳转的问题
- 算法笔记_001:斐波那契数的多种解法(Java)
- Google-glog 日志库使用手记
- springmvc 实例应用
- 利用cross join 构造大量测试数据