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

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

COPY  vs ADD

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

COPY <src>... <dest>
ADD <src>... <dest>

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 default
ARG VAR_A 5
# VAR_B gets the (overridden) value of VAR_A
ENV 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 <image> 输出 Hello world

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

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

ENTRYPOINT ["/bin/echo", "Hello"]
CMD ["world"]# run -it <image> 将会输出 Hello world
# run -it <image> 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/

  • 前后端分离,如何在前端项目中动态插入后端API基地址?(in docker)

  • 谁说docker-compose不能水平扩展容器、服务多实例?

  • 基于docker-compose的Gitlab CI/CD实践&排坑指南

  • 实例解读Docker Swarm

关注我们
更多干货及潮流技术

请关注Dotnet Plus公众号

“阅读全文,体验更佳”

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

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

相关文章

[JavaWeb-HTML]HTML概念介绍和快速入门

HTML 1. 概念&#xff1a;是最基础的网页开发语言* Hyper Text Markup Language 超文本标记语言* 超文本:* 超文本是用超链接的方法&#xff0c;将各种不同空间的文字信息组织在一起的网状文本.* 标记语言:* 由标签构成的语言。<标签名称> 如 html&#xff0c;xml* 标记…

ASP.NET Core使用Nacos SDK访问阿里云ACM

背景 前段时间&#xff0c;cranelee 在Github上给老黄提了个issues&#xff0c; 问到了如何用Nacos的SDK访问阿里云ACM。https://github.com/catcherwong/nacos-sdk-csharp/issues/13刚看到这个issues的时候&#xff0c;老黄也是觉得一脸懵逼&#xff0c;好像这两者没有什么必然…

[JavaWeb-JavaScript]JavaScript_Function函数(方法)对象

Function&#xff1a;函数(方法)对象 1. 创建&#xff1a;1. var fun new Function(形式参数列表,方法体); //忘掉吧2. function 方法名称(形式参数列表){方法体}3. var 方法名 function(形式参数列表){方法体}2. 方法&#xff1a;3. 属性&#xff1a;length:代表形参的个数…

java基础输入输出语句

输入语句 方法一&#xff1a; System.in和System.out方法 缺点一: 该方法能获取从键盘输入的字符&#xff0c;但只能针对一个字符的获取缺点二: 获取的只是char类型的。如果想获得int,float等类型的输入,比较麻烦。 import java.io.IOException; public class test {public…

为.netcore助力--WebApiClient正式发布core版本

1、前言NCC WebApiClient 已成熟稳定&#xff0c;发布了WebApiClient.JIT 和 WebApiClient.AOT 两个 NuGet 包&#xff0c;累计近 10w 次下载。我对它的高可扩展性设计相当满意和自豪&#xff0c;但 WebApiClient 并不因此而停下脚步&#xff0c;在一年前&#xff0c;我产生了编…

[JavaWeb-JavaScript]JavaScript_Data日期对象

Date&#xff1a;日期对象 1. 创建&#xff1a;var date new Date();2. 方法&#xff1a;toLocaleString()&#xff1a;返回当前date对象对应的时间本地字符串格式getTime():获取毫秒值。返回当前如期对象描述的时间到1970年1月1日零点的毫秒值差示例代码如下: <!DOCTYPE …

括号匹配+Java栈

括号匹配 import java.util.LinkedList;class MyStack{private int num;private LinkedList<Character>date;public MyStack(){this.num0;datenew LinkedList<Character>();}public boolean isEmpty(){return num0?true:false;}public void push(Character ch){t…

一个static和面试官扯了一个小时,舌战加强版

一&#xff1a;背景1. 讲故事最近也是奇怪&#xff0c;在社区里看到好几篇文章聊static 的玩法以及怎么拿这个和面试官扯半个小时&#xff0c;有点意思&#xff0c;点进去看都是java版的&#xff0c;这就没意思了&#xff0c;怎么也得有一篇和面试官扯C# 中的 static用法撒&…

[JavaWeb-JavaScript]JavaScript_Math数学对象

Math&#xff1a;数学对象 1. 创建&#xff1a;* 特点&#xff1a;Math对象不用创建&#xff0c;直接使用。 Math.方法名();2. 方法&#xff1a;random():返回 0 ~ 1 之间的随机数。 含0不含1ceil(x)&#xff1a;对数进行上舍入。floor(x)&#xff1a;对数进行下舍入。round(x…

数据结构整理中。。。

目录栈队列链表单向链表双向链表向链表中插入&#xff08;写入&#xff09;数据单向链表单向循环链表双向循环链表从链表中删除数据单向&#xff08;循环&#xff09;链表双向循环链表哈希表哈希函数冲突拉链法闭散列法并查集启发式合并&#xff08;按秩合并&#xff09;带权并…

.NET开发者省份分布排名

什么叫.NET开发者省份分布排名呢&#xff1f; 顾名思义&#xff0c;这几个词大家都认识&#xff0c;.NET开发者都集中在城市&#xff0c;涵盖一线城市到五线城市。排名的方法非常简单粗暴&#xff0c;就是根据本公众号&#xff08;dotnet跨平台&#xff09;的省份订阅读者数量排…

[JavaWeb-JavaScript]JavaScript_RegExp正则表达式对象

RegExp&#xff1a;正则表达式对象 1. 正则表达式&#xff1a;定义字符串的组成规则。1. 单个字符:[]如&#xff1a; [a] [ab] [a-zA-Z0-9_]* 特殊符号代表特殊含义的单个字符:\d:单个数字字符 [0-9]\w:单个单词字符[a-zA-Z0-9_]2. 量词符号&#xff1a;?&#xff1a;表示出现…

创建型模式——单例模式

一、 实验目的与要求 1.练习使用单例模式。设计相关的模拟场景并进行实施&#xff0c;验证模式特性&#xff0c;掌握其优缺点。 2.实验结束后&#xff0c;对相关内容进行总结。 二、实验内容 1.模式应用场景说明 在山区或者边远地区火车站往往只有一个窗口在买票&#xff0c;但…

Sql Server之旅——终点站 nolock引发的三级事件的一些思考

曾今有件事情让我记忆犹新&#xff0c;那年刚来携程不久&#xff0c;马上就被安排写一个接口&#xff0c;供企鹅公司调用他们员工的差旅信息&#xff0c;然后我就三下五除二的给写好了&#xff0c;上线之后&#xff0c;大概过了一个月。。。DBA那边报告数据库出现大量锁超时&am…

[JavaWeb-JavaScript]JavaScript_Global全局对象

Global 1. 特点&#xff1a;全局对象&#xff0c;这个Global中封装的方法不需要对象就可以直接调用。 方法名();2. 方法&#xff1a;encodeURI():url编码decodeURI():url解码encodeURIComponent():url编码,编码的字符更多decodeURIComponent():url解码parseInt():将字符串转为…

创建型模式——原型模式

一、 实验目的与要求 1.练习使用单一模式。设计相关的模拟场景并进行实施&#xff0c;验证模式特性&#xff0c;掌握其优缺点。 2.实验结束后&#xff0c;对相关内容进行总结。 二、实验内容 1.模式应用场景说明 原型模式&#xff1a;在需要一个类的大量对象的时候&#xff0c;…

现在就是.Net最好的时代!我赞成,谁反对?

2020年.NET Core逆袭冲榜&#xff0c;多榜直接冠军&#xff01;Build2020&#xff0c;发布多款产品赋能.NET开发者&#xff01;截止5月&#xff0c;腾讯&#xff0c;阿里&#xff0c;特斯拉等大厂都在招聘.NET&#xff01;这些征兆&#xff0c;都预示着.NET的春天即将到来&…

[JavaWeb-JavaScript]JavaScript_Array数组对象

Array:数组对象 1. 创建&#xff1a;1. var arr new Array(元素列表);2. var arr new Array(默认长度);3. var arr [元素列表];2. 方法join(参数):将数组中的元素按照指定的分隔符拼接为字符串push() 向数组的末尾添加一个或更多元素&#xff0c;并返回新的长度。3. 属性len…

如何给Blazor.Server加个API鉴权?

&#xff08;Ant Design of Blazor为努力而生&#xff09;书接上文&#xff0c;上次我们说到了最终选用Blazor.Server来实现了我们的MVP项目&#xff0c;额其实就是博客的增删改查&#xff0c;不过运行还是很爽的&#xff0c;不过是一个小demo&#xff0c;脑子里一直有个声音&a…

结构型模式——桥接模式

一、 实验目的与要求 1.练习使用桥接模式。设计相关的模拟场景并进行实施&#xff0c;验证模式特性&#xff0c;掌握其优缺点。 2.实验结束后&#xff0c;对相关内容进行总结。 二、实验内容 1.模式应用场景说明 相信大家都看过罗老师买奶茶的情节&#xff0c;现实生活中也是一…