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

特别声明:

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

 

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

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官方文档

 

posted @ 2018-03-23 17:09  Konrad  阅读(210)  评论(0编辑  收藏  举报