长话短说,今天分享三组容易混淆的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公众号

“阅读全文,体验更佳”

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

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

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

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

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

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

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

  4. NB-IOT开发|nbiot开发教程《三》AT指令类模组驱动-STM32实现AT指令状态机

    嵌入式开发中我们要时刻保持代码的高效与整洁看之前,先点赞 好习惯,要养成 一.前言 嵌入式开发中我们要时刻保持代码的高效与整洁.在第一节中"NB-IOT开发|nbiot开发教程<一&g ...

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

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

  6. Dockerfile 指令详解1

    Dockerfile 指令详解 我们已经介绍了 FROM,RUN,还提及了 COPY, ADD,其实 Dockerfile 功能很强大,它提供了十多个指令.下面我们继续讲解其他的指令. COPY 复制 ...

  7. 【Docker】之 Dockerfile 指令详解

    目录 Dockerfile 基本结构 Dockerfile 指令 指定基础镜像 FROM 维护者信息 MAINTAINER 元数据标签 LABEL 设置环境变量 ENV 镜像构建参数 ARG 指定工作 ...

  8. 十分钟熟练Dockerfile指令

    LABLE 给镜像添加元数据信息 COPY 用户从宿主机的当前目录复制文件至创建的新映像文件 COPY <src> <dest> COPY ["<src> ...

  9. docker之Dockerfile指令介绍

    Docker通过对于在Dockerfile中的一系列指令的顺序解析实现自动的image的构建 通过使用build命令,根据Dockerfiel的描述来构建镜像 通过源代码路径的方式 通过标准输入流的方 ...

最新文章

  1. 3.6 激活函数-深度学习-Stanford吴恩达教授
  2. android sdk里的各目录作用
  3. wenstorm设置谷歌_WebStorm+Chrome调试Vue步骤
  4. arm nodejs_英伟达打算收购Arm,或将成有史以来最大半导体收购案
  5. php怎样注释代码块,vscode怎样注释方法代码块
  6. 【SQL语句】 - Ctrl+3 查询表属性的存储过程 [sp_select_talberowName]
  7. DenseNet算法详解
  8. 使用arcpy遇到的那些坑(二)
  9. 优秀开源项目YYKit
  10. 人力资源管理系统详细设计说明书
  11. 易经- 第一卦 乾卦
  12. MacBook上下载安装Mysql
  13. 来听听外国UX设计师的22句话
  14. IPTV的前世今生与发展
  15. Linux下压缩的压缩命令
  16. 排序算法——十大排序算法总结与对比
  17. C语言 break语句
  18. kubernets-RBAC
  19. 微信真机调试时出现 (in promise) MiniProgramError {“errMsg“:“hideLoading:fail:toast can‘t be found“} Object
  20. Navicat Premium for Mac 11.1.8 中文破解版

热门文章

  1. PHP: 手把手编写自己的 MVC 框架实例教程
  2. Cannot resolve the collation conflict between SQL_Latin1_General_CP1_CI_AS and Latin1_General_100...
  3. PHP的学习--PHP的闭包
  4. 【2006-1】【字符统计】
  5. JQuery函数在IE浏览器中测试的注意事项
  6. 会议中的Meeting App
  7. vue mock模拟后台接口数据
  8. html走马观花效果,走马观花台湾行 用EF-S 10-18来记录风景
  9. PHP 基础篇 - PHP 中 DES 加解密详解
  10. 【Solidity】3.类型 - 深入理解Solidity