美文网首页
5.Dockerfile指令详解

5.Dockerfile指令详解

作者: 不安分的情绪 | 来源:发表于2018-01-24 14:56 被阅读0次

Docker可以通过Dockerfile的内容紫东构建镜像。
Dockerfile时一个包含创建镜像所有命令的文本文件,通过docker build命令可以根据Dockerfile的内容构建镜像,在介绍构建之前,我们先了解一下Dockerfile的基本语法结构.

Dockerfile有以下指令选项:

  • FROM
  • MAINTAINER
  • COPY
  • ADD
  • WORKDIR
  • VOLUME
  • EXPOSE
  • ENV
  • RUN
  • CMD
  • ENTRYPOINT
  • USER
  • ONBUILD

下面详细介绍各个指令的用法。

FROM

FROM指令时最重要的一个,并且必须为Dockerfile文件的第一个非注释行,其用于为镜像文件构建过程中指定一个基准镜像,后续的指令运行于次基准镜像所提供的运行环境。

语法

FROM <image>[:<tag>]
FROM <image>@<digest>
- image:指定作为base image的名称
- tag:base image的标签,为可选项,默认为latest

MAINTAINER

用于提供镜像作者的详细信息。

语法

MAINTAINER  < author's detail >

COPY

用于将宿主机的文件复制镜像中
语法

COPY  <src> ... <dest/> ]  # 多文件复制需要以空格分隔,dest必须时目录且为dest/,
COPY  ["<src>" ... "<dest>"] # 多文件复制需要以空格分隔,dest必须时目录且为dest/

支持通配符,路径中如果有空白,建议使用第二种格式,dest目录会在容器中自动创建。

ADD

类似于COPY指令,ADD支持tar文件和URL路径自动展开。

语法

ADD  <src> ... <dest>
ADD ["<src>" ... "<dest>"]
  • 如果<src>为URL且<dest>不以/结尾,则<src>指定的文件将被下载并直接被创建为<dest>
  • 如果<dest>以/结尾,则文件名URL指定的文件将被直接下载并保存为<dest>/<filename>
  • 如果<src>是一个本地系统上的压缩格式的tar文件,它将被展开为一个目录,其行为类似于“tar -x”命令;然而,通过URL获取到的tar文件将不会自动展开;
  • 如果<src>有多个,或其间接或直接使用了通配符,则<dest>必须是一个以/结尾的目录路径;如果<dest>不以/结尾,则其被视作一个普通文件,<src>的内容将被直接写入到<dest>

WORKDIR

用于为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD设定工作目录。

语法

WORKDIR  <dirpath>
WORKDIR  $STATPATH

WORKDIR指令可出现多次,起路径可以为相对路径,不过其相对的时此前一个WORKDIR指令指定的路径。
WORKDIR也可以调用由ENV指定的变量。

VOLUME

用于在images中创建一个挂载点目录,以过载宿主机上的卷或其它容器上的卷。

语法

VOLUME <monuntpoint>  //将容器中的mountpoint挂载到宿主机上
VOLUME ["<mountpoint"]

如果挂载点目录路径下此前有文件存在,docker run命令会在卷挂载完成后将此前所有文件复制到新挂在卷中,基于此命令我们可以将容器中的日志挂载到宿主机上。

EXPOSE

用于为容器打开指定要监听的端口以实现与外部通信。
语法

EXPOSE  <port>[/protocol]   [<port>[/<protocol>] ... ]
- port:为端口
- protocol:为协议,默认为tcp协议,

EXPOSE指令可一次指定多个端口,例如:EXPOSE 11211/udp 11211/tcp

ENV

用于为镜像定义所需要的环境变量,并可悲Dockerfile文件中的其他指令(ENV、ADD、COPY)所调用。

调用格式为$var或者${var}

语法

ENV  <key>  <value>  //一次只能设置一个变量
ENV  <key>=<value>  ...  //一次能设置多个变量,如果value中有空格,使用`\`进行转义

定义多个变量时,建议使用第二种方式,以便于在同一层中完成所有的功能。

RUN

用于指定docker build过程中运行的程序,其可以是任何命令

语法

RUN <command>  
RUN ["<executable>" , "<param1>", "<param2>", ...] 

第一种:command通常为shell命令,不能接收Unix信号
第二种:JSON格式的数组exectable为要运行的命令,后面的parm为命令的参数或选项。

CMD

用于运行任何命令或应用程序,RUN命令用于运行构建镜像的过程中,而CMD指令时运行基于Dockerfile构建出的新镜像文件启动容器时。
语法

CMD  <command>
CMD  ["<executable>","<parm1>","<parm2>"]
CMD ["<param1>","param2"]

前两种语法格式意义同RUN
第三种则用于ENTRYPOINT指令提供默认参数

ENTRYPOINT

用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序

与CMD命令不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数覆盖,而且,命令行参会会被当作参数传递给ENTRYPOINT指定的程序。

语法

ENTRYPOINT  <command>
ENTRYPOINT ["executable","parm1","parm2"]

Dockerfile中也可以存在多个ENTRYPOINT指令,但仅有最后一个会生效

USER

指定运行images的用户名或UID,默认的运行用户为root

语法

USER  <UID> | <User_Name>

UID可以为任意数字,但是实践中其必须为/etc/passwd中某用户的有效UID,否则docker run命令会运行失败。

ONBUILD

用于在Dockerfile中定义一个触发器

Dockerfile用于build镜像文件,此镜像文件可以作为base image被另一个Dockerfile用作FROM指令的参数,并以之构建新的镜像文件。

ONBUILD <instruction>

尽管任何指令都可注册为触发器指令,但是ONBUILD不能自我嵌套,且不会出发FROM和MAINTAINER指令。

使用包含ONBUILD指令的Dockerfile构建的镜像应该使用特殊的标签,例如:ruby:2.0-onbuild

在ONBUILD指令中使用ADD或COPY指令应该格外小心,因为新构建过程的上下文在缺少指定的源文件时会失败

相关文章

  • 5.Dockerfile指令详解

    Docker可以通过Dockerfile的内容紫东构建镜像。Dockerfile时一个包含创建镜像所有命令的文本文...

  • FreeMarker | 笔记篇

    java中Freemarker list指令详解 java中Freemarker if else指令详解 java...

  • Dockerfile 指令

    指令格式 注释: 指令 指令详解 FROM 指令 注意: 镜像必须是已存在的镜像 后续指令基于这个基础镜像进行执行...

  • 40.Vue自定义指令--局部

    Vue指令详解参考 当全局指令和局部指令同名时以局部指令为准 案例(局部指令聚焦输入框): index.vue

  • Linux

    linux awk命令详解、linux awk命令Linux常用操作指令Linux netstat命令详解 awk...

  • Dockerfile

    Dockerfile指令详解 一.指令:FROM 功能:设置基础镜像(指定base镜像 linux发行版本) 语法...

  • Dockerfile指令详解

    Dockerfile指令详解 FROM 要么 要么 该FROM指令初始化一个新的构建阶段,并为后续指令设置 基本映...

  • Docker 构建镜像

    Docker 构建镜像 环境 Dockerfile 指令详解 FROM or FROM : FRO...

  • 5.DockerFile

    1.简介 docekrfile是用来构建docker镜像的文件,是由一系列命令和参数构成的脚本构建三步骤:dock...

  • 004-Dockerfile详解

    [TOC] 1. DockerFile 样例 2. 指令详解 2.1 COPY 复制指令,从上下文目录中复制文件...

网友评论

      本文标题:5.Dockerfile指令详解

      本文链接:https://www.haomeiwen.com/subject/ibiyaxtx.html