内容摘要

  1. dockerfile 常用指令
  2. 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相关推荐

  1. docker ubuntu镜像_docker使用教程

    上手步骤 安装docker-->普通用户加入docker用户组-->获取镜像-->基于镜像创建容器-->进入容器-->可以在容器里随意捯饬环境或者运行东西啦~ 安装doc ...

  2. centos7镜像加速_使用阿里云容器镜像服务托管私有Docker镜像

    一个只用markdown语法编写文章的90后野路子Web架构师,每天都分享一些有用的知识点,欢迎关注- 前言 概述 本文主要讲解如何托管自己的Docker镜像到阿里云容器镜像服务ACR上,以及如何使用 ...

  3. docker 修改阿里镜像源_使用阿里云容器镜像服务托管私有Docker镜像

    一个只用markdown语法编写文章的90后野路子Web架构师,每天都分享一些有用的知识点,欢迎关注- 前言 概述 本文主要讲解如何托管自己的Docker镜像到阿里云容器镜像服务ACR上,以及如何使用 ...

  4. 发布镜像到DockerHub和阿里云容器镜像服务

    文章目录 一.发布镜像到DockerHub 1.拥有一个DockerHub的账号 2.在服务器上登录DockerHub账号 3.发布镜像 二.发布镜像到阿里云容器镜像服务 1.登录阿里云,进入容器镜像 ...

  5. java项目打镜像_docker通过dockerfile打java项目镜像

    环境:centos7 思路:java -jar 启动的项目打包成docker images进行运行 创建dockerfile-->创建shell脚本-->打包images 1.docker ...

  6. 生产中的12种容器镜像扫描最佳实践

    现在很多团队面临着这么一个挑战:如何在不减慢应用交付速度的情况下,管理好安全风险.有种方法可以解决该问题,就是采用安全的 DevOps 工作流程. 安全的DevOps(也称为DevSecOps)会在从 ...

  7. 让容器应用管理更快更安全,Dragonfly 发布 Nydus 容器镜像加速服务

    镜像对容器部署的挑战 在容器的生产实践中,偏小的容器镜像能够很快地部署启动.当应用的镜像达到几个 GB 以上的时候,在节点上下载镜像通常会消耗大量的时间.Dragonfly 通过引入 P2P 网络有效 ...

  8. 如何构建尽可能小的容器镜像?

    关注我们获得更多内容 这是Google Developer Advocate Sandeep Dinesh 关于如何充分利用Kubernetes环境的七部分视频和博客系列的第一部分. 主要讲保持容器镜 ...

  9. 什么是容器服务_【小牛云计算课堂】什么是容器镜像服务

    容器镜像服务(Container Registry)提供安全的应用镜像托管能力,精确的镜像安全扫描功能,稳定的国内外镜像构建服务,便捷的镜像授权功能,方便用户进行镜像全生命周期管理.容器镜像服务简化了 ...

最新文章

  1. 2021全球数据中心市场预测:资本支出将增长10%
  2. How to become the truely yourself?
  3. JavaScript 世界万物诞生记
  4. 高级进阶:Azure DevOps搞定.NET Core编译版本号自增
  5. [转载] Python3网络爬虫
  6. pb graph鼠标移上显示数据_Plotly数据可视化:离线版、微软vscode版的Python的基本作图...
  7. 数组对象的过滤(取出一项中的某些字段)
  8. 怎么禁用计算机的可信执行,英特尔®融合安全和管理引擎、英特尔®服务器平台服务、英特尔®可信执行引擎和英特尔®主动管理技术咨询 (intela-sa-00185)...
  9. python数据分析-如何在业余时学数据分析?
  10. mysql ibatis 批量插入_ibatis 批量插入逻辑
  11. SpringBoot整合shiro的一个例子
  12. 怎么用几何画板作一些简单的图形
  13. 基于Multisim的555时基电路
  14. 使用ffmpeg打开ts格式视频文件
  15. express基本使用步骤
  16. 怎么搭建百度网盘目录搜索网站?网盘目录#百度网盘
  17. python爬虫之帅哥图片爬取
  18. 资深 iOS 开发工程师教你5 道题全面考察候选人
  19. the remote end hung up unexpectedly Everything up-to-date
  20. 将图片转成base64字符串并在JSP页面显示的Java代码

热门文章

  1. python什么模块动态调用链接库_python如何调用扩展模块
  2. 2021-05-10 矩阵AB和矩阵BA有什么联系?
  3. 【Ray Tracing in One Weekend 超详解】 光线追踪1-7 Dielectric 半径为负,实心球体镂空技巧...
  4. python中的re模块——正则表达式
  5. 使用css3实现瀑布流布局效果
  6. mui框架之a标签无法跳转的问题
  7. 算法笔记_001:斐波那契数的多种解法(Java)
  8. Google-glog 日志库使用手记
  9. springmvc 实例应用
  10. 利用cross join 构造大量测试数据