Dockerfile文件语法

 

1、FROM指令nginx

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

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

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

 

 

2、LABEL和MAINTAINER指令数组

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

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

 

 

3、RUN指令curl

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

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特性的话,能够将其替换为相似下面的格式ide

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

 

 

4、CMD指令ui

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

注意:

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

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

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

 

 

5、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指令则会被忽略

 

 

6、EXPOSE指令

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

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

#例 EXPOSE 9012/udp 9016/tcp

注意:EXPOSE只是表示当前镜像在运行为容器的时候能够暴露指定的端口,可是须要在docker run的时候配合 -P选项。不然即便在Dockerfile文件中经过EXPOSE指定了端口,在容器运行时默认仍是不会暴露端口的。EXPOSE必定须要配合-P选项才能发挥做用

 

7、WORKDIR指令

用于为Dockerfile中全部的RUN、CMD、ENTRYPOINT、COPY和ADD指令设定工做目录

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

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

WORKDIR /path/to/workdir

 

 

8、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>不存在,它将会被自动建立,包括其父目录路径

 

 

9、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>必须是一个以/结尾的目录路径;

 

 

10、ENV指令

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

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

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

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

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

 

 

11、VOLUME指令

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

VOLUME  ["path"]

 

 

12、USER指令

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

USER userUSER user:gidUSER user:group

 

 

十3、ONBUILD指令

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

ONBUILD  <INSTRUCTION>

# 示例:

ONBUILD COPY copyFile/config /data

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

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

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

三、能够经过查看docker inspeat <image>命令执行结果的onbuild键来查看某个镜像ONBUILD指令定义的内容

四、ONBUILD中定义的指令会当作 引用该镜像的Dockerfile文件的FROM指令的一部分来执行,执行顺序会按ONBUILD定义的前后顺序执行,若是ONBUILD中定义的任何一个指令运行失败,则会使FROM指令中断并致使整个build失败,当全部的ONBUILD中定义的指令成功完成后,会按正常顺序继续执行build。

五、ONBUILD中定义的指令不会继承到当前引用的镜像中,也就是当引用ONBUILD的镜像建立完成后将会清除全部引用的ONBUILD指令

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

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

相关文章
相关标签/搜索