• Dockerfile文件语法


     

    一、FROM指令

     第一条命令必须是FROM,表示需要构建的镜像是由哪个镜像为基础镜像,后续的指令运行于此基准镜像所提供的运行环境

    FROM命令,支持下面两种形式

    FROM <image>
    
    FROM <image>:<tag>

    二、LABEL和MAINTAINER指令

     指定构建镜像的作者的信息,新版本docker已经摒弃MAINTAINER,使用LABEL实现,LABEL保存key=value健值对元数据

    MAINTAINER "作者信息"
    
    LABLE maintainer="作者信息"

    三、RUN指令

     RUN指令会在一个新的容器中执行任何命令,可以出现多次RUN指令,然后把执行后的改变提交到当前镜像,提交后的镜像会被用于Dockfile中定义的下一步操作,RUN中定义的命令会按顺序执行并提交

    RUN <command>  # shell模式,相当于命令行的/bin/bash -c command
      <command>通常是一个shell命令,且以"/bin/sh -c"来运行它。
    RUN ["<executable>","<param1>","<param2>"] # exec模式,可以指定其他的shell执行指令 

      直接由内核创建运行进程,可处理系统发送过来的信号,无法调用shell中的变量。参数是一个JSON格式的数组,其中<executable>为要运行的命令,后面的<paramN>为传递给命令的选项或参数;然而此种格式指定的命令不会以"/bin/sh -c"来发起,如果要运行的命令依赖于此shell特性的话,可以将其替换为类似下面的格式

    RUN ["/bin/bash", "-c", "<executable>", "<param1>"]

     

    四、CMD指令

    CMD指令中指定的命令会在镜像运行时执行,在Dockfile中只能存在一个,如果使用了多个CMD指令,则只有最后一个CMD指令有效。当出现ENTRYPOINT指令时,CMD中定义的内容会作为ENTRYPOINT指令的默认参数,也就是说可以使用CMD指令给ENTRYPOINT传递参数。

    注意:

    1、RUN和CMD都是执行命令,它们的差异在于RUN中定义的命令会在执行docker build命令构建镜像时执行,而CMD中定义的命令会在执行docker run命令运行镜像时执行,

    2、使用第一种语法也就是调用exec执行时,命令必须为绝对路径

    CMD ["<executable>","<param1>","<param2>"]  #将会调用exec执行,首选方式
    
    CMD <command>  <param1>  <param2>  #将会调用/bin/sh -c执行
    
    CMD ["param1","param2"]  #当使用ENTRYPOINT指令时,为该指令传递默认参数

    五、ENTRYPOINT指令

     ENTRYPOINT指令中指定的命令会在镜像运行事执行,在Dockerfile中只能存在一个,如果使用了多个ENTRYPOINT命令,则只有最后一个指令有效。

    ENTRYPOINT指令中指定的命令(exec执行的方式)可以通过docker run来传递参数,例如docker run <image> -l 启动的容器将会把-l 参数传递给ENTRYPOINT指令定义的命令并会覆盖CMD指令中定义的默认参数(如果有的话),但不会覆盖该指令定义的参数(如果想要覆盖,在docker run加上参数–entrypoint)。例: ENTRYPOINT ["ls","-a"],CMD["/etc"],当通过docker run <image>启动容器时该容器会运行ls -a /etc 命令,当使用docker run <image> -l 启动事,该容器会运行ls -a -l命令,-l参数会覆盖CMD指令中定义的/etc参数。

    ENTRYPOINT ["<executable>","<param1>","<param2>"] #
    
    CMD <command>  <param1>  <param2>

    注意:当出现ENTRYPOINT指令时,当ENTRYPOINT指令使用exec方式执行时CMD指令只可能被当做ENTRYPOINT指令的参数使用,其他情况CMD指令则会被忽略

     

     

    六、EXPOSE指令

    用于为容器打开指定要监听的端口以实现与外部通信,EXPOSE指令可一次指定多个端口

    EXPOSE <port>[/<protocol>]  [<port>[/<protocol>]] 

    #例 EXPOSE 9012/udp 9016/tcp

    注意:EXPOSE只是表示当前镜像在运行为容器的时候可以暴露指定的端口,但是需要在docker run的时候配合 -P选项。否则即使在Dockerfile文件中通过EXPOSE指定了端口,在容器运行时默认还是不会暴露端口的。EXPOSE一定需要配合-P选项才能发挥作用

    七、WORKDIR指令

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

    在Dockerfile文件中,WORKDIR指令可以出现多次,其路径也可以为相对路径,不过,其是相对此前一个一个WORKDIR指令指定的路径

    另外WORKDIR也可调用ENV指定定义的变量

    WORKDIR /path/to/workdir

    八、COPY指令

     用于从指定路径拷贝一个文件或目录到容器的指定路径中

    COPY <src>  <dest>

    <src> : 是一个文件或目录的路径,是相对于Dockerfile文件所在位置的相对路径,<src>路径必须与Dockerfile在同级目录或子目录中,例如不能通过ADD ../somepath,因为在执行docker build时首先做的就是把Dockerfile所在目录包含子目录发送给docker。

    <dest>:目标容器的一个绝对路径,否则以WORKDIR为其起始路径。注意:在路径中有空白字符时,通常使用第二种方式

    复制规则:

       如果<src>是目录,则其内部文件或子目录会被递归复制,但<src>目录自身不会被复制,相当于shell 中的cp -r /root/dir/* /tmp

       如果指定了多个<src>或在<src>中使用了通配符,则<dest>必须是一个目录,且必须以/结尾

      如果<dest>不存在,它将会被自动创建,包括其父目录路径

    九、ADD指令

     ADD指令类似于COPY指令,<src>是一个文件或目录的路径,也可以是一个url,路径是相对于该Dockerfile文件所在位置的相对路径,<dest>是目标容器的一个绝对路径,

    例如/home/harara/Docker/Dockerfile这个文件中的定义的ADD /data.txt  /db/指令,将会尝试拷贝文件/home/harara/Docker/data.txt到将要生成的容器的/db/data.txt

    ADD  <src>  <dest>

    # 示例:

    COPY nginx-1.15.2.tag.gz /data/ # 单纯复制文件
    ADD nginx-1.15.2.tag.gz /data/  # 解压复制文件夹

    ① 如果执行docker build - < somefile即通过标准输入来创建时,ADD指令只支持url方式,另外如果url需要认证,则可以通过RUN wget ...或RUN curl ...来完成,ADD指令不支持认证。

    ② <src>路径必须与Dockerfile在同级目录或者子目录中

    ③ 如果<src>为URL且<dest>不以/结尾,则<src>指定的文件将被下载并直接被创建为<dest>.如果<dest>以/结尾,则文件名URL指定的文件将被直接下载并保存为<dest>/<filename>

    ④ 如果<src>是一个本地系统的压缩格式的tar文件,他将被展开为一个目录,其行为类似于”tar -x”命令,不过通过URL获取的tar文件将不会被自动展开;

    ⑤ 如果<src>有多个,或使用了通配符,则<dest>必须是一个以/结尾的目录路径;

    十、ENV指令

     ENV指令用于设置环境变量,构建镜像过程和容器运行过程都有效。如果需要在运行时更改这些环境变量可以在运行docker run时添加-env <key>=<value>参数来修改。

    注意:最好不要定义那些可能和系统预定义的环境变量冲突的名字,否则可能会产生意想不到的结果

    ENV <key> <value>
    
    ENV <key>=<value>

    第二种格式可一次设置多个变量,每个变量为一个”<key>=<value>”的健值对.如果<value>中包含空格,可以以反斜线()进行转义,也可以通过对<value>加引号进行标识.另外,反斜线也可用于续行

    在docker run的时候可以通过-e 选项直接覆盖Dockerfile文件中已经指定的ENV或者添加为容器新的ENV变量的

    十一、VOLUME指令

    VOLUME指令用来设置一个挂载点,可以用来让其他容器挂载以实现数据共享或对容器数据的备份、恢复或迁移。

    VOLUME  ["path"]

    十二、USER指令

     USER指令用于设置用户或uid来运行生成的镜像和执行RUN命令

    USER user
    
    USER user:gid
    
    USER user:group

     

    十三、ONBUILD指令

     ONBUILD指令,镜像触发器,当一个镜像被其他镜像作为基础镜像时执行,会在构建过程中插入指令

    ONBUILD  <INSTRUCTION>

    # 示例:

    ONBUILD COPY copyFile/config /data
    
    #在构建基础镜像的dockerfile添加上面命令,实际构建的时候不会执行COPY命令,当构建另一个新镜像并且以该镜像为基础镜像时,会执行COPY命令。

    1、ONBUILD指令用来设置一些触发的指令,用于当该镜像被作为基础镜像来创建其他镜像时(也就是Dockerfile中的FROM为当前镜像时)执行一些操作,ONBUILD中定义的指令会在用于生成其他镜像的Dockerfile文件的FROM指令之后执行,上述介绍的任何一个指令都可以用于ONBUILD指令,可以用来执行一些因为环境而变化的操作,使镜像更加通用。

    2、ONBUILD中定义的指令在当前镜像的build中不会被执行

    3、可以通过查看docker inspeat <image>命令执行结果的onbuild键来查看某个镜像ONBUILD指令定义的内容

    4、ONBUILD中定义的指令会当做 引用该镜像的Dockerfile文件的FROM指令的一部分来执行,执行顺序会按ONBUILD定义的先后顺序执行,如果ONBUILD中定义的任何一个指令运行失败,则会使FROM指令中断并导致整个build失败,当所有的ONBUILD中定义的指令成功完成后,会按正常顺序继续执行build。

    5、ONBUILD中定义的指令不会继承到当前引用的镜像中,也就是当引用ONBUILD的镜像创建完成后将会清除所有引用的ONBUILD指令

    6、ONBUILD指令不允许嵌套,例如ONBUILD ONBUILD ADD . /data是不允许的

    7、ONBUILD指令不会执行其定义的FROM,MAINTAINER指令

     

    作者:小念
    本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
  • 相关阅读:
    hdu 2020
    hdu 1005
    hdu1014
    集合(一)
    史上最全的 Java 新手问题汇总
    表单验证
    oracle优化原则(二)
    vue的学习--如何使用Intellij IDEA配置并运行vue项目
    在win10环境下IED配置spark项目
    在win10环境下配置spark和scala
  • 原文地址:https://www.cnblogs.com/kiko2014551511/p/14539160.html
Copyright © 2020-2023  润新知