码迷,mamicode.com
首页 > 其他好文 > 详细

Dockerfile文件语法

时间:2021-03-17 14:21:47      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:环境   替换   备份、恢复   定义   镜像   rgb   参数传递   指令   就是   

 

一、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指令

 

Dockerfile文件语法

标签:环境   替换   备份、恢复   定义   镜像   rgb   参数传递   指令   就是   

原文地址:https://www.cnblogs.com/kiko2014551511/p/14539160.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!