Dockerfile指令介绍

Dockerfiledocker

Dockerfile 指令介绍shell

FROM数组

FROM指令是最重要的一个且必须为Dockerfile文件开篇的第一个非注释行,用于为映像文件构建过程指定基准镜像,后续的指令运行于此基准镜像所提供的运行环境tcp

实践中,基准镜像能够是任何可用镜像文件,默认状况下,docker build会在docker主机上查找指定的镜像文件,在其不存在时,则会从Docker Hub Registry上拉取所需的镜像文件(若是找不到指定的镜像文件,docker build会返回一个错误信息)ide

语法:ui

FROM <regository>[:<tag>]或spa

FROM <regository>@<digest>命令行


MAINTAINER递归

用于让Dockerfile制做者提供本人的详细信息进程

Dockerfile不限定MAINTAINER指令出现的位置,但推荐将其放置于FROM指令以后

语法:

MAINTAINER "liheng <liheng@anchnet.com>"


COPY

用于从Docker主机复制文件至建立的新映像文件

语法:

COPY <src> ... <dest>或

COPY ["<src>",... “<dest>”]

<src>:要复制的源文件或者目录,支持使用通配符

<dest>:目标路径,即正在建立的image的文件系统路径;建议为<dest>使用绝对路径,不然,COPY指定则以WORKDIR为其起始路径。

文件复制准则:

一、<src>必须是build上下文中的路径,不能是其父目录中的文件

二、若是<src>是目录,则其内部文件或子目录会被递归复制,但<src>目录自身不会被复制

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

四、若是<dest>事先不存在,它将会被自动建立,这包括其父目录路径


ADD

ADD指令相似于COPY指令,ADD支持使用TAR文件和URL路径

语法:

ADD <src> ... <dest>或

ADD ["<src>",... "<dest>"]

操做准则

一、同COPY指令;

二、若是<src>为URL且不以/结尾,则<src>指定的文件将被下载并直接被建立为<dest>;若是<dest>以/结尾,则文件名URL指定的文件将被直接下载并保存为<dest>/<filename>;

三、若是<src>是一个本地系统上的压缩格式的rar文件,它将被展开为一个目录,其行为相似于"tar -x"命令;然而,经过URL获取到的tar文件将不会自动展开;

四、若是<src>有多个,或其间接或直接使用了通配符,则<dest>必须是一个以/结尾的目录路径;若是<dest>不以/结尾,则其被视做一个普通文件,<src>的内容将被直接写入到<dest>;

WORKDIR

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

语法:

WORKDIR <DIRPATH>

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

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

例如:

WORKDIR /var/log

WORKDIR $STATEPATH

VOLUME

用于在image中建立一个挂载点目录,以挂载Docker host上的卷或其余容器上的卷

语法:

VOLUME <mountpoint>或

VOLUME ["<mountpoint>"]

若是挂载点目录路径下此前的文件存在,docker run命令会在卷挂载完成后将此前的全部文件复制到新挂载的卷中

EXPOSE

用于为容器打开指定要监听的端口以实现与外部通讯

语法:

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

<protocol>用于指定传输层协议,可为tcp或udp两者之一,默认为TCP协议

EXPOSE指令可一次指定多个端口,例如:

EXPOSE 11211/udp 11211/tcp

ENV

用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于其后的其余指令(ENV、ADD、COPY等)所调用.

调用格式:$variable_name或${variable_name}

语法:

ENV <key> <value>或

ENV <key>=<value> ...

第一种格式中,<key>以后的全部内容均会被视做其<value>的组成部分,所以,一次只能设置一个变量;


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

定义多个变量时,建议使用第二种方式,以便在同一层中完成全部功能

RUN

用于指定docker build过程当中运行的程序,起能够是任何命令

语法:

RUN <command>或

RUN ["<executable>","<param1>","<param2>"]

一、第一种格式中,<command>一般是一个shell命令,且以"/bin/sh -c"来运行它,这意味着此进程在容器中的PID不为1,不能接收Unix信号,所以,当使用docker stop <container>命令中止容器时,此进程接收不到SIGTERM信号;

二、第二种语法格式中的参数是一个JSON格式的数组,其中<executable>为要运行的命令,后面的<paramN>为传递给命令的选项或参数;然而,此种格式指令的命令不会以"/bin/sh -c"来发起,所以常见的shell操做如变量替换以及通配符(?,*等)替换等将不会进行;不过,要运行的命令依赖于此shell特性的话,能够将其替换为相似下面的格式:

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


CMD

相似于RUN指令,CMD指令也可用于运行任何命令或应用程序,不过,两者的运行时间点不一样

一、RUN指令运行与映像文件构建过程当中,而CMD指令运行于基于Dockerfile构建出的新映像文件启动一个容器时

二、CMD指令的首要目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止;不过,CMD指定的命令其能够被docket run的命令行选项所覆盖

三、在Dockerfile中能够出现多个CMD指令,但仅最后一个会生效

语法:

CMD <command>或

CMD ["<executable>","<param1>","<param2>"]或

CMD ["<param1>","<param2>"]

前两种的语法格式的意义同RUN

第三种则用于为ENTRYPOINT指令提供默认参数

相关文章
相关标签/搜索