特别声明:

  博文主要是学习过程中的知识整理,以便之后的查阅回顾。部分内容来源于网络(如有摘录未标注请指出)。内容如有差错,也欢迎指正!

=============系列文章=============

1. Docker学习(一): 基本概念

2. Docker学习(二): 镜像的使用与构建

3. Docker学习(三): Dockerfile指令介绍

4. Docker学习(四): 操作容器

=================================

COPY:从构建上文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>为止

  格式1:COPY <源路径>...<目标路径>

  格式2:COPY ["<源路径1>",..."<目标路径>"]

    示例:COPY packge.json /usr/src/app

    <源路径>:可以是多个,甚至可以是通配符(符合Go的filepath.Match规则)

    <目标路径>:可以是容器内的绝对路径,也可以是相对于工作目录的相对路径(工作目录可以用WORKDIR指令来指定)。目标路径不需要事先创建,如果不存在会在复制文件前先行创建确实目录。

    :使用COPY指令,源文件的各种元数据都会保留。比如读写执行权限、文件变更时间等。这个特性对于镜像定制很有用,特别是构建相关文件都在使用Git进行管理的时候。

    

ADD:与COPY的格式和性质基本一致,但在COPY基础上增加了一些功能

  <源路径>:可以是一个URL, Docker引擎会试图去下载这个连接的文件到<目标路径>去。下载后文件权限自动设置为600;另外,如果下载的是个压缩包,需要解压缩则需要额外的一层RUN指令进行解压缩。如果<源路径>为一个tar压缩文件的话,ADD指令将会自动解压缩这个压缩文件到<目标路径>去。

  :尽可能使用COPY,因为COPY的语义明确。最适合使用ADD的场合,就是所提及的需要自动解压缩的场合。另外ADD指令会令镜像构建缓存失效,从而导致镜像构建变得缓慢。

CMD:指定默认的容器主进程的启动命令,在运行时可以指定新的命令来替代镜像设置中这个的默认命令。

  shell格式:CMD <命令>,这种格式实际的命令会被包装为sh -c的参数形式进行执行

    示例:CMD echo $HOME   ------实际执行变更为----->  CMD [ "sh", "-c", "echo $HOME" ]

  exec格式(推荐,一定要使用双引号):CMD ["可执行文件", "参数1", "参数2"]

  参数列表格式:CMD ["参数1", "参数2"], 在指定了ENTRYPOINT指令后,使用CMD指定具体的参数

  注:Docker不是虚拟机,容器中的应用都应该以前台执行。对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义,从而退出,其他辅助进程不是它需要关心的。比如 CMD service nginx start,容器执行后会立即退出,原因是该命令会被理解为 CMD ["sh", "-c", "service nginx start"],因此主进程是sh,sh一旦结束,容器也随之退出。正确的写法: CMD ["nginx", "-g", "daemon off;"],以前台形式运行。

ENTRYPOINT:格式与RUN指令格式一样,分为exec格式和shell格式。该指令的作用是指定容器启动程序及参数,与CMD有些类似。当指定了ENTRYPOINT后,CMD的含义就发生了改变,不在是直接的运行其命令,而是将CMD的内容作为参数传给ENTRYPOINT指令。

ENV:设置环境变量。无论是其后面的其他指令(如RUN),还是运行时的应用,都可以直接使用这里定义的环境变量

  格式1:ENV <key><value>

  格式2:ENV <key1>=<value1> <key2>=<value2> ...

  注:含有空格的变量值需要双引号括起来, 在指令中以$key1的方式获取变量。环境变量可以在ADD、COPY、ENV、EXPOSE、LABEL、USER、WORKDIR、VOLUME、STOPSIGNAL、ONBUILD指令展开。

ARG:构建参数,与ENV一样设置环境变量;所不同的是,ARG所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。可以通过docker history来查看。

  格式:ARG <参数名>[=<默认值>], 定义参数名称以及默认值。默认值可以在构建命令docker build中用--build-arg <参数名>=<值>覆盖。

  

VOLUME:指定目录挂载为匿名卷,这样数据不会向容器存储层写入。运行时可用-v参数覆盖挂载设置。

  格式1:VOLUME ["路径1", "路径2", ...]

  格式2:VOLUME <路径>

EXPOSE:声明运行时容器提供服务端口,只是声明,在运行时并不会因为声明就会开启这个端口的服务。

  格式:EXPOSE <端口1> [<端口2>...]

  声明的好处:一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处测试在运行时使用随机端口映射(docker run -P)时会自动随机映射EXPOSE的端口。

WORKDIR:指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如果目录不存在,WORDIR会帮你建立目录。

USER:指定当前用户,改变环境状态并影响以后的层。USER是改变之后层的执行RUN,CMD以及ENTRYPOINT这类命令的身份。切换的用户必须是事先建立好的,否则无法切换。

  注:如果以root执行的脚本,在执行期间希望改变身份。不要使用su或者sudo,建议使用gosu。

HEALTHCHECK:判断容器主进程的服务状态是否还正常。

  HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令

  HEALTHCHECK NONE:如果基础镜像有健康检查指令,该指令可以屏蔽掉其他健康检查指令。

    --interval=<间隔>:两次健康检查的间隔,默认为30秒

    --timeout=<时长>:健康检查命令运行超时时间,超过时间视为失败,默认30秒

    --retries=<次数>:连续失败指定次数后,则容器状态视为unhealthy,默认3次

  :和CMD,ENTRYPOINT一样,HEALTHCHECK只可以出现一次,若写了多个,只有最后一个生效。

ONBUILD:该指令后面跟的是其他指令,比如RUN,COPY等,这些指令在构建镜像的时候不会被执行,只有当前镜像为基础镜像,去构建下一集镜像的时候才会被执行。ONBUILD是为了帮助别人定制自己而准备的。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

参考:

1.《docker_practice》

2. Dockerfile官方文档

Docker学习(三): Dockerfile指令介绍的更多相关文章

  1. Docker应用三:Dockerfile使用介绍(以安装redis为例)

    Dockerfile使用介绍 一.Dockerfile介绍 Dockerfile用于自定义创建docker镜像,是由一行行命令组成的文件. Docker file中的命令根据作用分为四类: 1.1.指 ...

  2. Docker学习(11) Dockerfile指令

    Dockerfile指令 指令格式 FROM MAINTAINER RUN EXPOSE CMD ENTRYPOINT ADD COPY VOLUME WORKDIR ENV USER ONBUILD ...

  3. [转帖]Docker学习之Dockerfile命令详解

    Docker学习之Dockerfile命令详解 https://it.baiked.com/system/docker/2436.html 图挺好的 前言 之前,制作镜像的伪姿势搭建已经见过了,今天介 ...

  4. Docker学习笔记三 Dockerfile 指令 定制镜像

    本文地址:https://www.cnblogs.com/veinyin/p/10412079.html  镜像是分层存储的,每一层都是独立存在的,修改当前层并不会修改其依赖的上一层,删除某一层也只是 ...

  5. docker之Dockerfile指令介绍

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

  6. docker(8)Dockerfile指令介绍

    前言 Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明. Dockerfile简介 Dockerfile是用来构建Docker镜像的构建文件,是由一系列 ...

  7. Docker(二):Dockerfile 使用介绍

    上一篇文章Docker(一):Docker入门教程介绍了 Docker 基本概念,其中镜像.容器和 Dockerfile .我们使用 Dockerfile 定义镜像,依赖镜像来运行容器,因此 Dock ...

  8. Docker 学习8 Dockerfile详解2

    一.继续上章节Docker学习7 CMD命令后. 11.ENTRYPOINT a.容器启动后相当于会启动ENTRYPOINT + CMD 命令,CMD相当于参数传给entrypoint的 [root@ ...

  9. Docker系列三:Dockerfile

    Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像 Dockerfile由一行行命令语句组成,支持#开头的注释 Dockerfile分为四部分:基础镜像信 ...

随机推荐

  1. c语言博客作业06-文件

    1.本章总结  1.1思维导图  1.2本章学习体会 这周学了结构体和文件,结构体作为一种数据的归类方式,相比数组或变量更具有整体全面性,例如一个数组只可以放一些按照元素顺序存放的单元变量,并且我们用 ...

  2. 1087 1 10 100 1000(打表 set 数学)

    1087 1 10 100 1000 题目来源: Ural 1209 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 1,10,100,1000... ...

  3. 【OCP-12c】CUUG 071题库考试原题及答案解析(21)

    3.choose three View the Exhibit and examine the description of SALES and PROMOTIONS tables. You want ...

  4. linux 下的 crontab 定时任务工具

    以下内容转自:https://www.cnblogs.com/longjshz/p/5779215.html 在LINUX中,周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep c ...

  5. LG的nexus5(32GB版本 - 821)-TOT-底包 可用于救砖!

    LG的nexus5(32GB版本 - 821)-TOT-底包 底层修复效果完美,通过LGflashTool1.8直接刷进去就行~ 底包下载: https://pan.baidu.com/s/1Z5WD ...

  6. wpa2破解代码思路(教你写poc)

    前言:此篇关于1.wpa2协议漏洞的产生原因:2.scapy这个数据包库的基础:3.最后讲解代码思路,让你们从伪代码可以直接写成代码展开介绍分享~ 本文作者:i春秋签约作家——kaikaix 1.大家 ...

  7. Mutation Observer

    MutationEvent Mutation Observer 变动观察器, 等待所有脚本任务完成后,才会运行(即异步触发方式) 把DOM变动记录封装成一个数组进行处理,而不是一条条个别处理DOM变动 ...

  8. vscode调试typescript

    1.记录一个插件:https://www.npmjs.com/package/ts-node # Locally in your project  npm install -D ts-node npm ...

  9. pixi.js v5版本出了。

    历尽千辛万苦,pixi.js v5版本出了. 请关注群 881784250, 会尽块出个微信小游戏版. pixi.js的每个函数,每个类都有测试用例的.出的版本都是很稳定的.

  10. 正则表达式 IP域名

    不废话,我这个起码不坑人,有的把我坑死 var objRegExp = /^((([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))))\.)((([0-9]|([ ...