美文网首页
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指令详解

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