0
点赞
收藏
分享

微信扫一扫

Docker file指令

FROM

FROM是最重要的指令,用于为映像文件构建过程指定基准镜像,后续的指令运行于此基准镜像所提供的运行环境;
实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build会在docker主机上查找指定镜像文件,在其不存在时,则会从 docker hub registry上拉取所需的镜像文件;
如果找不到指定镜像,docker build会返回一个错误信息;

MAINTAINER

用于让dockerfile制作者提供本人的详细信息;
Dockerfile并不限制MAINTAINERR指令出现的位置,但推荐将其放置于FROM指令之后;
MAINTAINER用于早期dockerfile中,现在已经废弃了,推荐使用LABEL指令

LABEL

格式:LABEL <key>=<value> <key>=<value><key>=<value> ......
LABEL指令不仅可以表示MAINTAINER

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路径
操作准则:
同COPY指令;
如果<src>为URL且<dest>不以/结尾,则<src>指定的文件将被下载并直接被创建为<dest>; 如果<dest>以/结尾,则文件名URL指定的文件将被直接下载并保存为<dest>/<filename>
如果<src>是一个本地系统上的压缩格式的tar文件,它将被展开为一个目录,其行为类似于"tat -x "命令,;然而,通过URL获取到的tar文件将不会自动展开;
如果<src>有多个,或其间接或直接使用了通配符,则<dest>必须是一个以/结尾的目录路径;如果<dest>不以/结尾,则其被视作一个普通文件,<src>的内容将被直接写入到<dest>;

WORKDIR

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

VOLUME

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

格式:

VOLUME <mountpoint>或

VOLUME ['<mountpoint>']

如果挂载点目录路径下此前的文件存在,docker run命令会在卷挂载完成后将此前的所有文件复制到新挂载的卷中;

EXPOSE

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

格式:

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

<protocol>用于指定传输层协议,默认为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>加引号进行标识;另外,反斜线也可用于续行;

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

ARG

不同于 env在于, ENV是在docker run 时进行赋值,并传给容器中运行的进程的;

ARG是build过程中,传给docker build的命令,由build过程按需定制出不同的镜像的参数;

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/bash", "-c", "executable", "param1"]

CMD

类似于RUN 指令,CMD指令也可用于运行任何命令或应用程序,不过二者的运行时间点不同

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

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

​ 在Dockerfile中可以存大多个CMD指令,但仅最后一个会生效;
格式:

CMD <command>或

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

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

前两种格式的意义同RUN

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

ENTRYPOINT

类似于CMD指令的功能 , 用于为容器指定默认运行程序, 从而使用得容器像是一个单独的可执行程序;

与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run 命令指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT指令指定的程序

不过,docker run命令的--entrypoint选项的参数可覆盖ENTRYPOINT指令指定的程序

格式:

ENTRYPOINT <command>

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

docker run 命令传入的命令参数会覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后做为其参数使用

Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个生效

USER

用于指定运行image时的或运行Dockerfile中任何RUN、CMD或ENTRYPOINT指令指定的程序时的用户名或UID

默认情况下,container的运行身份为root用户

格式:

USER <UID>|<UserName>

需要注意的是,<UID>可以为任间数字,但实践中其必须为/etc/passwd中某用户的有效UID,否则,docker run命令将运行失败

HEALTHCHECK

用于为容器进行健康状态检测

--interval=DURATION (default: 30s)

--timeout=DURATION(default: 30s)

--start-period=DURATION(default: 0s)

--retries=N(default: 3)

比如:

HEALTHCHECK --interval=5m --timeout=3s \

​ CMD curl -f http://localhost/ || exit 1

举报

相关推荐

docker file

docker指令

Docker 常用指令

docker常用指令

docker 常用指令

0 条评论