docker file详解

docekr file详解
    docker file是用来构建自己的镜像的另一种方式,如果基于docker容器直接构建的话,需要暂时停止容器的运行,否则
    一旦容器在读写的过程中构建会出现问题。
    note:容器运行起来分为两个过程,第一步是build,第二步是run
docker file 一定要有自己的工作目录,一般在docker配置文件中可以修改,默认是在/root/docker下

docker file instructions
    FROM
        FROM指令是最重的一个,且必须为docker file 文件开篇的第一个非注释行,用于为映像文件构建过程指定
        基准镜像,后续的指令运行于此基准镜像所提供的运行环境
        实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build会在docker主机上查找指定的镜像文件
        ,在其不存在时,则会从docker hub registry上拉取所需的镜像文件
        如果找不到指定的镜像文件,docker build会返回一个错误信息
        syntax:
            FROM <repository>[:tag]或
            FROM <repository>@<digest>
                <repository>:指定作为base image的名称
                <tag>:base image的标签,为可选项,省略时默认为latest
            
    MAINTANIER
        用于让docker file制作者提供本人的详细信息,docker file 并不限制MAINTANIER的出现位置,但推荐将其
        放在FROM指令之后
        syntax:
            MAINTANIER <authtor's detail>
                <authtor's detail>:可以是任意文本信息,但约定是使用作者名称和邮箱地址
                例如: MANINTANIER "作者名 邮箱地址"
    
    CPOY
        用于从docker主机复制文件到创建的新映像文件
        syntax:
            COPY <src> <dest>或
            COPY ["<src1>","<src2>",...<"dest">]
                src:要复制的源文件或目录,支持使用通配符
                dest:目标路径,即正在创建的image的文件系统路径,建议为dest使用绝对路径,否则,COPY指定则已
                WORKDIR为起始路径
                note:(当路径中有空白字符时要使用第二种写法,否则会将其认为成两个文件)
        
        文件复制准则:
            <src>必须是build上下文中的路径,不能是其父目录中的文件
            如果<src>是目录,则其内部文件或子目录会被递归复制,但<src>自身目录不会复制
            如果指定了多个<src>,或在<src>中使用了多个通配符,则<dest>必须是一个目录,且必须以/结尾
            如果dest事先不存在,他将会被自动创建,这包括其父目录路径
            
    ADD
        类似于COPY指令,ADD支持使用tar文件和URI路径
        syntax:
            ADD <src> <dest>或
            ADD ["<src1>","<src2>",..."<dest>"]
        操作准则:
            同COPY指令
            如果<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指定设定工作目录
        syntax:
            WORKDIR <dirpath>
                在dockerfile文件中,WORKDIR指令可以出现多次,其路径也可以为相对路径,不过,其是相对此前一个
                WORKDIR指令指定的路径,另外,WORKDIR也可调用由ENV指定定义的变量
            例如:
                WORKDIR /var/log
                WORKDIR $stat
                
    VOLUME
        用于在image中创建一个挂载点目录,以挂载docker host上的卷或其他容器上的卷
        syntax:
            VOLUME <mountpoint> 或
            VOLUME ["<mountpoint>"]
        如果挂载点目录路径下此前有文件存在,docker run 命令会在卷挂载完成后将此前的所有文件复制到新挂载的卷中
        
    EXPOSE
        用于为容器打开指定要监听的端口以实现与外部通信
        syntax
            EXPOSE [<port>/<protocol>] [<port>/<protocol>]...
            <protococl>用于指定传输层协议,可为tcp或udp二者之一,默认为tcp协议
            EXPOSE指令可一次指定多个端口,例如
                EXPOSE 11211/udp 11211/tcp
        note:虽然在dockerfile中指定了要监听的端口,但是除容器以及本地host之外的主机仍然无法访问,需加上-P选项
        
    ENV
        用于为镜像定义所需的环境变量,并可被docker file文件中位于其后的其他指令(如: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 ["<executable>","<parm1>","<parm2>"]
        第一种格式中,<command>通常是一个shell命令,且以"/bin/sh -c"来运行它,这意味着此进程在容器中的PID不为1,导致
        不能接受unix信号,因此,当使用docker stop <container>命令停止容器时,此进程接收不到SIGTERM信号
        第二种语法格式中的参数是一个JSON格式的数组,其中<executable>为要运行的命令,后面的<parmN>为传递命令的选项或
        参数;然而,此种格式指定的命令不会以"/bin/sh -c"来发起,因此常见的shell操作如变量替换以及通配符(?,*)等替换将
        不会进行;不过如果要运行的命令依赖于此shell特性的话,可以将其替换为类似下面的格式
            RUN ["/bin/bash","-c","<executable>","<parm>"]
            
    CMD
        类似于RUN的指令,CMD指令也可用于运行任何命令或应用程序,不过,二者的运行时间点不同,RUN指令运行于映像文件构建过程中
        ,而CMD指令运行于基于dockerfile构建出的一个新映像文件启动一个新容器时
        CMD指令的首要目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止,不过,CMD指定的命令其可以被docker run
        的命令行选项所覆盖
        在docker file中可以存在多个CMD指令,但仅最后一个会生效
        syntax:
            CMD <command> 或
            CMD ["<executable>","<parm1>","<parm2>"] 或
            CMD ["<parm1>","<parm2>"]
        前两种语法格式的意义同RUN,第三种则用于为ENTRYPOINGT指令提供默认参数
        
    ENTRYPOINT
        类似于CMD指令的功能,用于为容器指定默认的运行程序,从而使得容器像单独的可执行程序,与CMD不同的是,由ENTRYPOINT启动的程序不会被
        docker run命令行参数覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT指定的程序, 不过,docker run命令的--entrypoint选项的
        参数可覆盖ENTRYPOINT指令指定的程序
        syntax:
            ENTRYPOINT <command>
            ENTRYPOINT ["<executable>","<parm1>","<parm2>"]
        docker run命令传入的命令参数会覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后做为其参数使用
        dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个生效
    
     USER
        用于指定运行image时的或运行dockerfile中任何RUN,CMD或ENTRYPOINT指令指定的程序时的用户或UID,默认情况下,container的运行身份为root
        用户
        syntax:
            USER <UID> | <user name>
            需要注意的时,UID可以为任意数字,但实践中其必须为/etc/passwd中某用户的有效UID否则,docker run 命令将运行失败
    
    HEALTHCHECK
        用于对容器进行健康检查
        syntax:
            HEALTHCHECK --interval=5m --timeout=3s \
                CMD curl -f http://localhost/ || exit 1
            --interval=DURATION(default:30s)
                健康检查的间隔时间
            --timeout=DURATION(default:30s)
                健康检查的超时时间
            --start-period=DURATION(default:0s)
                健康检查的开始时间,因一旦设置此选项,当容器创建好后就会立刻进行健康检查,但是容器的服务并未启动所以,所以需要设置长一点
            --retries=N(default:3)
                健康检查允许失败的次数
        健康检查返回的结果
            0:success
            1:unhealthy
            2:reservd
    
    SHELL
        因操作系统不一样,所使用的shell也不一样而所有的进程皆是当前shell的子进程,当没有shell解释器的时候,内核其实什么都不知道,
        故SHELL指令存在的意义就是为容器指定某个shell来运行
        syntax:
            SHELL ["executable","parameters"]
            
    ONBUILD
        用于在dockerfile中定义一个触发器
        dockerfile用于build映像文件,此映像文件亦可作为base image被另外一个dockerfile用作FROM指令的参数,并已之构建其base image的docker file
        文件中的ONBUILD指令定义的触发器
        syntax:
            ONBUILD <INSTRUCTION>
        尽管任何指令都可注册成为触发器指令,但ONBUILD不能自我嵌套,且不会触发FROM和MAINTAINER指令,使用包含ONBUILD指令的dockfile构建的镜像应该使用
        特殊的标签,例如:ruby:2.0-onbuild
        在ONBUILD指令中使用ADD或COPY指令应该格外小心,因为新构建过程的上下文在缺少指定的源文件时会失败
note:所有的JSON数组一定要用双引号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值