解读三组容易混淆的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


  1. 可以从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中定义变量的指令。


28cee9c8fbaa94f2502b04ada75a61f8.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


RUN  vs ENTRYPOINT vs CMD


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


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


  1. 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。

相关文章
|
应用服务中间件 Shell Linux
DockerFile 中的保留字(指令)说明
FROM 表示新构建的镜像是基于哪个镜像的,指定一个已存在的镜像作为模板。dockerfile中第一条必须是from
|
6月前
|
运维 Linux Shell
Dockerfile中的保留字指令讲解
Dockerfile中的保留字指令讲解
98 0
|
6月前
|
JSON 物联网 Shell
Dockerfile指令详解
Dockerfile指令详解
124 0
Dockerfile(3) - WORKDIR 指令详解
Dockerfile(3) - WORKDIR 指令详解
1034 0
|
数据可视化 测试技术 Go
golang 单测运行单个函数、文件、跳过文件命令
golang 单测运行单个函数、文件、跳过文件命令
|
NoSQL Java Linux
DockerFile 保留字指令 | 学习笔记
快速学习 DockerFile 保留字指令
DockerFile 保留字指令 | 学习笔记
|
NoSQL 安全 Java
DockerFile 保留字指令|学习笔记
快速学习 DockerFile 保留字指令
DockerFile 保留字指令|学习笔记
|
存储 Shell 应用服务中间件
学习Docker就应该掌握的dockerfile语法与指令
在日常的工作中,常常需要制作自己的项目的镜像,一般通过以下两种方式制作镜像:Docker commit、Dockerfile。 ## Docker commit Docker commit一般用做从一个运行状态的容器来创建一个新的镜像。定制镜像应该使用Dockerfile来完成。 ``` docker commit 容器名 新镜像名:tag ``` 使用这种方式的缺点是:1.对外不
|
Docker 容器
Dockerfile文件中CMD指令与ENTRYPOINT指令的区别
本文是博主学习docker 制作镜像指令的记录,希望对大家有所帮助
195 0
Dockerfile文件中CMD指令与ENTRYPOINT指令的区别
Dockerfile(1) - FROM 指令详解
Dockerfile(1) - FROM 指令详解
601 0