长话短说,今天分享三组容易混淆的Dockerfile指令, 帮助大家编写更优雅的Dockfile文件、构建更纯净的Docker镜像。

COPY  vs ADD

COPY、ADD主体功能类似:从指定位置src拷贝文件到Docker镜像dest。

COPY ... ADD ... 

COPY只允许从Docker Engine主机上拷贝文件到Docker镜像文件;
ADD也能完成以上工作,但是ADD支持另外两种src:

  1. 文件源可以是URL
  2. 可以从src直接解压tar文件到目的地

ADD http://foo.com/bar.go /tmp/main.go# 从指定地址下载文件,添加到镜像文件系统的/tmp/main.go位置

ADD http://foo.com/bar.go /tmp/# 因为以/结尾,将会引用url中的文件名添加到指定的目录下

ADD /foo.tar.gz /tmp/# 自动解压主机文件到指定目录

有趣的是,URL下载和自动解压功能不能同时生效:任何通过URL下载的压缩包文件不会自动解压。

  • 如果拷贝本地文件到镜像,通常使用COPY,因为含义更明确

  • ADD支持URL文件、自动解压到指定目录,这2个特性也很棒

ARG vs ENV

ARG、ENV也让人很疑惑的,都是Dockerfile中定义变量的指令。ARG用于镜像构建阶段,ENV用于将来运行的容器

  • 生成镜像后,ARG值不可用,正在运行的容器将无法访问ARG变量值。

ARG  VAR_NAME 5# 构建镜像时,可提供--build-arg  VAR_NAME=6 修改ARG值。
  • ENV主要是为容器环境变量提供默认值,正在运行的容器可访问环境变量(这是将配置传递给应用的好方法):

ENV VAR_NAME_2 6# 启动容器时,可通过docker run -e "VAR_NAME_2=7"或docker-compose.yml提供新的环境变量值来覆盖Dockerfile中设置的ENV值。

一个小技巧:构建镜像时不能使用命令行参数重写ENV,但是你可以使用ARG动态为ENV设置默认值:

# You can set VAR_A while building the image or leave it at the defaultARG VAR_A 5# VAR_B gets the (overridden) value of VAR_AENV VAR_B $VAR_A

RUN  vs ENTRYPOINT vs CMD

  1. RUN 在新层中执行命令并产生新镜像,主要用于安装新软件包。

  2. ENTRYPOINT 执行程序的启动命令,当您想将容器作为可执行文件运行时使用。

  3. CMD和ENTRYPOINT 都可以提供程序的启动命令;CMD另一个作用是为执行中的容器提供默认值
  • CMD ["executable","param1","param2"] (可执行形式,最常见)

  • CMD command param1 param2 (脚本形式)
CMD echo "Hello world"# run -it  输出 Hello world

但是当容器以命令启动,docker run -it  /bin/bash, CMD会被忽略,bash解析器将会运行:root@98e4bed87725:/#

  • CMD ["param1","param2"] (作为ENTRYPOINT指令默认值,此时必须提供ENTRYPOINT指令,且ENTRYPOINT也必须以Json Array形式)
ENTRYPOINT ["/bin/echo", "Hello"]CMD ["world"]

# run -it  将会输出 Hello world# run -it  earth 将会输出 Hello earth

打算构建一个可执行的且常驻的镜像,最好选用ENTRYPOINT;
如果需要提供默认命令参数(可在容器运行时从命令行覆盖),请选择CMD。

Reference

  • https://www.ctl.io/developers/blog/post/dockerfile-add-vs-copy/
  • https://vsupalov.com/docker-arg-vs-env/
  • https://aboullaite.me/dockerfile-run-vs-cmd-vs-entrypoint/

作者:有态度的小码甲

博客园文章地址:

cnblogs.com/JulianHuang/p/13060375.html

  • 我是如何用 Redis 做实时订阅推送的
  • 分布式架构之美
  • 五年程序生涯的反思

dockerfile arg_解读三组容易混淆的 Dockerfile 指令相关推荐

  1. 解读三组容易混淆的Dockerfile指令

    长话短说,今天分享三组容易混淆的Dockerfile指令, 帮助大家编写更优雅的Dockfile文件.构建更纯净的Docker镜像. COPY  vs ADD COPY.ADD主体功能类似:从指定位置 ...

  2. 扩增子图表解读7三元图:三组差异数量和关系

    点击上方蓝色「宏基因组」关注我们!专业干货每日推送! 背景介绍(Introduction) 宏基因组学 宏基因组学目前的主要研究方法包括:16S/ITS/18S扩增子.宏基因组.宏转录组和代谢组,其中 ...

  3. origin三元相图_扩增子图表解读7三元图:三组差异数量和关系

    点击上方蓝色「宏基因组」关注我们!专业干货每日推送! 背景介绍(Introduction) 宏基因组学 宏基因组学目前的主要研究方法包括:16S/ITS/18S扩增子.宏基因组.宏转录组和代谢组,其中 ...

  4. 比较两组数据的差异用什么图更直观_扩增子图表解读7三元图:三组差异数量和关系...

    点击上方蓝色「宏基因组」关注我们!专业干货每日推送! 背景介绍(Introduction) 宏基因组学 宏基因组学目前的主要研究方法包括:16S/ITS/18S扩增子.宏基因组.宏转录组和代谢组,其中 ...

  5. 对‘pthread_create’未定义的引用_驾驭香辣调味油制作的巧劲,这三组香料组合拳劲道十足,容易引用...

    阅读本文前,请您先点击上面的"蓝色字体",再点击"关注",这样您就可以继续免费收到文章了. 每天都有分享,完全是免费订阅,请放心关注. 免责声明:我们致力于保护 ...

  6. 回望云计算发展 重新解读三种云服务

    本文讲的是回望云计算发展 重新解读三种云服务,云计算在非常短的时间里迅速兴起,并在个人和企业用户使用和运营计算的模式上发生了重要的演变.从概念上来说,云计算可以被视为在由虚拟化技术(虽然云计算并不总是 ...

  7. C++实现在正方体8个顶点上放数字使得三组相对的面上的4个顶点的和都相等

    输入一个含有8个数字的数组,判断有没有可能使得这个8个数字分别放到正方体的8个顶点上,使得正方体上三组相对应的面上的4个顶点的和都相等 #include<iostream> using n ...

  8. x³+y³+z³=3第三组整数解是多少,这个58年难题被40万台电脑算出来了

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI 你在看到标题的时候,一定会想: 这个问题我知道答案:x.y.z都等于1. 如果再多算几步,你还能发现4.4.-5也是一组整数解. 注意审题 ...

  9. 飞谷云六期第三组——基于Spark的机器学习

    项目正式开始时间:2015.10.15. 随笔内容:本次项目的主题是基于Spark的ML.对于ML的学习有大概半年了,正好在网上关注到了由上海交通大学所主办的这个飞谷云的大数据项目,我所报名的这期已经 ...

最新文章

  1. Elasticsearch的javaAPI之query dsl-queries
  2. Java扑克牌(斗地主发牌)
  3. Projection of Tuple DataSet具体用法
  4. 各种机器学习的优缺点及应用场景
  5. windbg linux内核调试,windbg调试虚拟机XP系统
  6. 【Keras】使用数据生成器(data generators)解决训练数据内存问题
  7. 咱们开始吧!第一次作业
  8. css模块化配置---webpack4+less
  9. 机器学习- 吴恩达Andrew Ng 编程作业技巧 for Week5 Neural Networks Learning
  10. 机器学习岗面试准备提纲笔记
  11. Chrome谷歌浏览器无法自动同步的解决办法
  12. 全加器在计算机的应用,利用全加器构成3位并行加法器.doc
  13. 实战 | 航空公司客户价值分析-LRFCM模型
  14. Python编程:腾讯防水墙原理浅析与Flask结合测试
  15. jquery mysql实现加入购物车_jquery-实现加入购物车效果
  16. (转)mysql explain
  17. 2020安洵杯部分WP —— 没人比我更懂签到题和问卷题队伍
  18. skynet框架应用 (十四) 登录服务
  19. cmd怎么进入linux系统时间,在LINUX的命令提示符及CMD命令提示符中显示时间
  20. 教你零基础制作3D旋转相册(送给那个她~)

热门文章

  1. python之设计模式的装饰器9步学习
  2. 将packages/apps/下的app导入eclipse
  3. HUB,交换机,路由器,MODEM都有什么区别???
  4. 数据驱动工程:跟踪使用,合理决策
  5. 10g的客户端从9i的服务器中导出数据时遇到上面的问题
  6. 堆内存 和 栈内存的简单理解 (未完待续~)
  7. 线上CPU100%?看看这篇是怎么排查的!
  8. Robot Framework(十二) javascript基础
  9. a标签无跳转的死链接
  10. 【Hadoop】在Linux中的Hadoop部署与yarn HDFS MapReduce 的配置中常见的问题?你解决了吗?