• 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指令

     

    作者:小念
    本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
  • 相关阅读:
    vue3.0中如何使用ueditor
    如何在vue+element中实现选择框和穿梭框的根据拼音以及拼音首字母以及汉字的模糊搜索
    select 使其默认选中文本不为空
    java环境配置
    amaze ui 滚动监听
    vue项目中如何使用less
    强大的css3库
    input type file兼容性
    select中想要加a链接 并且新窗口打开
    echarts绘制k线图为什么写candlestick类型就报错
  • 原文地址:https://www.cnblogs.com/kiko2014551511/p/14539160.html
Copyright © 2020-2023  润新知