Linux-Dockerfile指令详解

Dockerfile中各个指令详解:
    Environment replacement:
        ${variable:-word}:如果变量未设置或者变量的值为空,引用变量时则使用后面这个值(word),即默认值(word)
        ${variable:+word}:如果变量设置了值,则引用时使用word字符串,未设置变量时则为空
    FROM:
        FROM指令是最重要的一个且必须为Dockerfile文件开篇的第一个非注释行,用于为映像文件构建过程指定基准镜像,后湖的指令运行于此基准镜像所提供的的运行环境
        镜像拉取顺序:
            先在本地查找指定的镜像文件,若其不存在,则会从Dockerfile HubRegistry上拉取
        Syntax:
            FROM <repository>[:<tag>] 或
            FROM <repository>@<digest>
                <repository>:指定作为base image的名称
                <tag>:base image的标签,为可选项,省略时默认为latest
    MAINTANIER:
        用于让Dockerfile制作者提供本人的详细信息
        Syntax:
            MAINTAINER <author's detail>
                <author's detail>:可是任何文本信息,约定俗成的使用作者名及邮箱地址
                    example:
                        MAINTAINER zhangsan <zhangsan@163.com>
    LABEL:
        Syntax:
            LABEL <key>=<value> <key>=<value>....
    COPY:
        用于从Docker主机复制文件至创建的新映像文件(即将Dockerfile同级及其子目录的文件复制到创建的容器中)
        Syntax:
            COPY <src> ... <dest> 或
            COPY ["<src>", ... "<dest>"]
                <src>:要复制的源文件或目录,支持使用通配符
                <dest>:目标路径,即正在创建的image的文件系统路径;建议为<dest>使用绝对路径,否则,COPY指定则以WORKDIR为其起始路径
            注意:
                在路径中有空白字符时,通常使用第二种格式
        文件复制准则:
            1.<src>必须是build上下文中的路径,不能是其父目录中的文件
            2.如果<src>是目录,则其内部文件或子目录都会被递归复制,但<src>目录自身不会被复制
            3.如果指定了多个<src>,或在<src>中使用了通配符,则<dest>必须是一个目录,且必须以/结尾
            4.如果<dest>事先不存在,它将会被自动创建,这包括其父目录路径
    ADD:
        ADD指令类似于COPY指令,ADD支持使用TAR文件和URL路径
        Syntax:
            ADD <src> ... <dest> 或
            ADD ["<src>",..."<dest>"]
        操作准则:
            1.同COPY指令
            2.如果<src>为URL且不以/结尾,则<src>指定的文件将被下载并直接被创建为<dest>;如果<dest>以/结尾,则文件名URL指定的文件将被直接下载并保存到<dest>/<filename>
            3.如果<src>是一个本地系统上的压缩格式的tar文件,它将被展开为一个目录,其行为类似于"tar xf"命令;然而,通过URL获取到的tar文件将不会自动展开
            4.如果<src>有多个,或其间接货直接使用了通配符,则<dest>必须是一个以/结尾的目录路径;如果<dest>不以/结尾,则其被视为一个普通文件,<src>的内容将被直接写入到<dest>;
    VOLUME:
        用于再image中创建一个挂载点目录,以挂载Docker host上的卷或其它容器上的卷
        Syntax:
            VOLUME <mountpoint> 或
            VOLUME ["<mountpoint>"]
        如果挂载点目录路径下此前文件存在,docker run命令会在卷挂载完成后将此前的所有文件复制到新挂载的卷中
    EXPOSE:
        用于为容器打开指定要监听的端口以实现与外部通信
        Syntax:
            EXPOSE <port> [/<protocol>] [<port>[/<protocol>]...]
                <protocol>:用于指定传输层协议,可为tcp或udp二者之一,默认为tcp协议
        EXPOSE指令可一次指定多个端口,例如:
            EXPOSE 11211/udp 11211/tcp
    ENV:
        用于为镜像定义所需要的环境变量,并可被Dockerfile文件中位于气候的其它指令如(ENV,ADD,COPY等)所调用
        调用格式为:
            $variable_name或${variable_name}
        Syntax:
            ENV <key> <value> 或
            ENV <key>=<value> ...
        第一种格式中:
            <key>之后的所有内容均会被视作其<value>的组成部分,因此,一次只能设置一个变量
        第二种格式中:
            可以一次设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<value>中包含空格,可以以反斜线(\)进行转义,也可通过对<value>加引号进行标识,另外,反斜线也可用于续行
        定义多个变量时,建议使用第二种,以便在同一层中完成所有功能
    RUN:
        用于指定docker build过程中运行的程序,其可以是任何命令
        Syntax:
            RUN <command> 或
            RUN ["<excutable>","<param1>","<param2>"]
        第一种格式中:
            <command>通常是一个shell命令,且以"/bin/sh -c"来运行它,这意味着此进程在容器中的PID部位1,不能接收Unix信号,因此,当使用docker stop <container>命令来停止容器时,此进程接收不到SIGTERM信号
            第二种语法格式中的参数是一个JSON格式的数组,其中<excutable>为要运行的命令,后面的<paramN>为传递给命令的选项或参数,然而,此种格式指定的命令不会以"/bin/sh -c"来发起,因此常见的shell操作如变量的替换以及通配符(?,*等)替换将不会进行,不过,如果要运行的命令依赖于此shell特性的话,可以将其替换为类似下面的格式
                RUN ["/bin/bash","-c","<executable>","<param1>"]
    CMD:
        类似于RUN指令,CMD指令也可用于运行任何命令或应用程序,不过,二者的运行时间点不同
            1.RUN指令运行于映像文件的构建过程中,而CMD指令运行基于Dockerfile构建出的新映像文件启动一个容器时
            2.CMD指令的首要目的在于为启动的容器指定默认要运行的程序,且运行结束后,容器也将终止,不过,CMD指定的命令使其可以被docker run的命令行选项所覆盖
            3.在Dockerfile可以存在多个CMD指令,但仅最后一个会生效
        Syntax:
            1.CMD <command> 或
            2.CMD ["<executable>","<param1>","<param2>"] 或
            3.CMD ["<param1>","<param2>"]
            注:
                前两种语法格式的意义同RUN
                第三种则用于为ENTRYPOINT指令提供默认参数
    USER:
        用于指定运行image时的或运行Dockerfile中任何RUN,CMD或ENTRYPOINT指令指定的程序时的用户名或UID
        默认情况下,container的运行身份为root用户
        Syntax:
            USER <UID> | <UserName>
            注:
                需要注意的是:<UID>可以为任意数字,但实践中必须为/etc/passwd中某用户的有效UID,否则,docker run命令将运行失败
    ENTRYPOINT:
        类似于CMD指令的功能,用于为容器指定默认运行程序,从而使容器像是一个单独的可执行程序
        与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且,这些命令行参数会被当做参数传递给ENTRYPOINT指令指定的程序
            不过,docker run命令的--entrypoint选项的参数可覆盖ENTRYPOINT指令指定的程序
        Syntax:
            ENTRYPOINT <command>
            ENTRYPOINT ["<executable>","param1","param2"]
        docker run命令传入的命令参数会覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后做为其参数使用
        Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个会生效
    HEALTHCHECK:
        用于对容器进行状态监测:
        格式:
            1.HEALTHCHECK [OPTIONS] CMD command(check container health by running a command inside the container)
                [OPTIONS]的选项:
                    --interval=DURATION(default:30s)        # 健康监测间隔,默认是30s
                    --timeout=DURATION(default:30s)         # 超时时间:默认30s
                    --start-period=DURATION(default:0s)        #  等待主进程初始化完成的时间,默认0s
                    --retries=N(default:3)      # 重试次数,默认3次
                CMD命令执行完成之后的返回状态:
                    0:success           成功
                    1:unhealthy         不健康
                    2:reserved          可以自定义
            2.HEALTHCHECK NONE (disable any healthcheck inherited from the base image)      # 拒绝任何的健康状态监测
    SHELL:
        默认的shell是["/bin/sh","-c"]
    STOPSIGNLE:
        Syntax:
            STOPSIGNAL signal
    ARG:
        与ENV相似,但只在build-time时使用,可以在docker build的时候使用--build-arg <varname>=<value>传入,只在build中使用
        应用场景:
            应用程序版本修改时,可以传参数来指定应用程序版本
    ONBUILD:
        用于在Dockerfile中定义一个触发器
        Dockerfile用于build映像文件,此映像文件亦可作为base image被另一个Dockerfile用作FROM指令的参数,并以之构建新的映像文件
        在后面的这个Dockerfile中的FROM指令在build过程中被执行时,将会"触发"创建其base image的Dockerfile文件中的ONBUILD指令定义的触发器
        Syntax:
            ONBUILD <INSTRUCTION>
        注:
            1.尽管任何指令都可注册成为触发器指令,但ONBUILD不能自我嵌套,且不会触发FROM和MAINTAINER指令
            2.使用包含ONBUILD指令的Dockerfile构建的镜像应该使用特殊的标签,例如ruby:2.0-onbuild
            3.在ONBUILD指令中使用ADD或COPY指令应格外小心,因为新构建过程的上下文在缺少指定的源文件时会失败

posted @ 2020-07-13 16:51  Vampire-Min  阅读(779)  评论(0编辑  收藏  举报