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

COPY vs ADD

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

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

COPY 接收src、dest参数,只允许从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 /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

最新文章

  1. js和css文件压缩
  2. 不可错过的炒鸡棒的js迷你库
  3. Extjs MVC学习随笔01
  4. Maven构建Hadoop Maven构建Hadoop工程
  5. poj1274 The Perfect Stall (二分最大匹配)
  6. Redis 主从 Replication 的配置,主从复制原理
  7. Long与long的比较
  8. [未完成]关于java基础数据类型中的一些总结
  9. 佛山Uber优步司机奖励政策(2月1日~2月7日)
  10. Java 堆内存(Heap)[转]
  11. 多个Activity交互的生命周期:
  12. JAVA提高八:动态代理技术
  13. GCC精彩之旅_1
  14. 听晴明老师从头讲React Native 百度云下载 百度网盘
  15. python selenium简单安装及使用
  16. HTML,js的基础知识
  17. Win10和Ubuntu双系统搭建详
  18. C#Windows服务程序安装常见问题解决方法
  19. ElasticSearch5.X的冷热数据架构
  20. Python标准库inspect

热门文章

  1. redis主从复制、主从延迟知几何
  2. vue 3.0新特性
  3. vue钩子
  4. SpringBoot2.x整合quartz实现多任务定时执行
  5. 矩阵重叠面积计算 线段树hdu1542
  6. vue 配置移动单位转换插件 postcss-px-to-viewport
  7. Java——变量自增(++)自减(--)
  8. Linux(一):VMware安装出现的问题
  9. 处理异常方式try_catch_finally, throws,throw
  10. win服务器管理软件巧利用——如何让服务器管理事半功倍