zoukankan      html  css  js  c++  java
  • 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指令应格外小心,因为新构建过程的上下文在缺少指定的源文件时会失败

  • 相关阅读:
    实现FTP断点续传
    系统软件自动部署实现方案
    QT实现多语言切换
    QTreeWidget实现动态加载本地文件系统
    QuaZip实现多文件打包
    FileZilla命令行实现文件上传以及CreateProcess实现静默调用
    ctkPlugin插件系统实现项目插件式开发
    Windows与Linux下文件操作监控的实现
    QT皮肤系统的动态切换
    OpenGL 学习
  • 原文地址:https://www.cnblogs.com/Vampire-MIn/p/13294131.html
Copyright © 2011-2022 走看看