dockerfile 几组易混命令找茬

简介: dockerfile 几组易混命令找茬

背景


在docker在使用中,发现其命令中有几组有趣的命令,总是成对出现的,功能看似差不多,但是又有一丝丝差别,今天介绍几种,来波找茬!


1.COPY vs ADD


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


COPY <src>... <dest>


ADD <src>... <dest>


COPY只允许从Docker Engine主机上拷贝文件到Docker镜像文件;

ADD也能完成以上工作,但是ADD支持另外两种src:


文件源可以是URL


可以从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个特性也很棒


2.ARG vs ENV


ARG、ENV也让人很疑惑的,都是Dockerfile中定义变量的指令。

1dc618a0ed9580ce8bfa6facb208c08f.png


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


3.RUN vs ENTRYPOINT vs CMD


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


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


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。


总结:


cmd和entripoint的区别就是 cmd不可以覆盖,entripoiint可以被覆盖和追加.

这个覆盖是 docker run时后面加的 命令 和 cmd/entripoint的shell命令是否覆盖


4.-p 和-P


这2个命令不是在dockerfile中的,是在运行程序的时候,都可以做docker端口映射,在docker run启动一个容器时,有时候用-p 8080:8080 或者直接-P 不加端口号,这里有什么区别?


-P的使用


-P将容器内部开放的网络端口随机映射到宿主机的一个端口上;、


-p的使用


-p指定要映射的端口,一个指定端口上只可以绑定一个容器。


使用方式有以下几种:

1) IP:HOSTPORT:CONTAINERPORT:指定ip、指定宿主机port、指定容器port


适用于映射到指定地址的指定端口,例如将容器的5000端口映射到指定地址127.0.0.1的5000端口上:


-p 8081:8080 是把容器的8080和映射到宿主机的8081上


docker run -it -d -p 127.0.0.1:8081:8080 tomat /bin/bash

2) IP::CONTAINERPORT:指定ip、未指定宿主机port(随机)、指定容器port


适用于映射到指定地址的任意端口


将容器的9000端口映射到127.0.0.1的任意端口上:


docker run -it -d -p 127.0.0.1::9000  tomcat   /bin/bash

3)HOSTPORT:CONTAINERPORT :未指定ip、指定宿主机port、指定容器port


适用于将容器指定端口指定映射到宿主机的一个端口上(映射所有接口地址),将容器的80端口映射到宿主机的8000端口上:


docker run -itd -p 8000:80 nginx /bin/bash

特别说明


查看端口映射配置


可以使用


docker port CONTAINER_ID


5.dockerfile中的volume和 docker run -v


dockerfile中的volumn只是容器中的对外映射目录,会在宿主机上随机生成一个目录。

docker run -v 可以指定 主机目录:容器目录


相关文章
|
C++ 容器
c++ STL 之 vector 的 capacity 和 size 属性区别
c++ STL 之 vector 的 capacity 和 size 属性区别
279 0
quartus 小技巧—— 分线。例如总线data[31..0],引出的分线为data[7..0]
在数字电路设计中,总线用于并行传输数据,而分线是从总线中提取特定数据位。Quartus II,Altera(现Intel)的EDA工具,支持灵活的总线分线操作。本文介绍了两种在Quartus II中实现分线的方法:一是直接索引,如`data[7:0]`;二是使用Verilog的`extract`操作,尽管在Verilog中直接索引更常见。这些技巧有助于提升设计效率。
|
12月前
|
缓存 安全 程序员
易语言在跨平台开发中有哪些常见的技术挑战和解决方案
易语言在跨平台开发中有哪些常见的技术挑战和解决方案
288 1
|
人工智能
ChatGPT 常见错误原因及解决方案:报错、回答不完整等
最近,由人工智能实验室 OpenAI 发布的对话式大型语言模型 ChatGPT 火得一塌糊涂。它可以与人类轻松地对话,无论是多么奇葩的问题 ChatGPT 都不在话下。在体验 ChatGPT 的同时我们也会遇到各种各样的问题,这里我总结了其对话过程中可能会发生的错误以及如何去解决它们。
215319 5
ChatGPT 常见错误原因及解决方案:报错、回答不完整等
|
安全 Java 调度
Java面试题:Java内存优化、多线程安全与并发框架实战,如何在Java应用中实现内存优化?在多线程环境下,如何保证数据的线程安全?使用Java并发工具包中的哪些工具可以帮助解决并发问题?
Java面试题:Java内存优化、多线程安全与并发框架实战,如何在Java应用中实现内存优化?在多线程环境下,如何保证数据的线程安全?使用Java并发工具包中的哪些工具可以帮助解决并发问题?
159 0
|
算法 C语言 Python
优化Python代码性能的五大技巧
在当今快节奏的软件开发环境中,Python作为一种高级编程语言,受到了广泛的欢迎。然而,随着项目规模的增长和性能需求的提升,优化Python代码的性能变得至关重要。本文将介绍五种有效的技巧,帮助开发人员优化Python代码,提高程序的性能和效率。
|
SQL 数据库
深入理解 SQL UNION 运算符及其应用场景
SQL UNION运算符用于组合两个或多个SELECT语句的结果集。 每个UNION中的SELECT语句必须具有相同数量的列。 列的数据类型也必须相似。 每个SELECT语句中的列也必须按照相同的顺序排列。
361 1
|
XML Java 测试技术
Spring5源码(5)-Spring内部Bean和父子Bean
Spring5源码(5)-Spring内部Bean和父子Bean
117 0
|
缓存 监控 NoSQL
Redis的哨兵模式是什么?它的作用是什么?
Redis的哨兵模式是什么?它的作用是什么?
390 0