Docker file指令

网友投稿 756 2022-08-31

Docker file指令

Docker file指令

FROM

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

MAINTAINER

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

LABEL

格式:LABEL = == ......LABEL指令不仅可以表示MAINTAINER

COPY

用于从Docker主机复制文件至创建的新映像文件格式:​ COPY ...​ COPY [""...""]​: 要复制的源文件或目录,支持使用通配符​: 目标路径,即正在创建的image的文件系统路径;建议为使用绝对路径,否则,COPY指定则以WORKDIR为其起始路径

注意: 在路径中有空白字符时,通常使用第二种格式

文件复制准则: 必须是build上下文中的路径,不能是其父目录中的文件;如果是目录,则其内部文件或子目录会被递归复制,但目录自身不会被复制;如果指定了多个,或在中使用了通配符,则必须是一个目录,且必须以/结尾如果事先不存在,它将会自动创建,这包括其父目录路径;

ADD

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

WORKDIR

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

VOLUME

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

格式:

VOLUME

VOLUME ['']

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

EXPOSE

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

格式:

EXPOSE [/] [[/]......]

用于指定传输层协议,默认为TCP协议;

EXPOSE指令可一次指定多个端口;比如

EXPOSE 11211/udp 11211/tcp

ENV

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

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

格式:

ENV

ENV =...

第一种格式中,之后的所有内容均会被视作其的组成部分,因此一次只能设置一个变量;

第二种格式可以用一次设置多个变量,每个变量为一个"="的键值对,如果中包含空格,可以以反斜线()进行转义,也可以通过对加引号进行标识;另外,反斜线也可用于续行;

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

ARG

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

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

RUN

用于指定docker build过程中运行的程序,其可以是任何命令;

格式:

RUN

RUN ["","",""]

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

第二种格式中的参数是一个JSON格式的数组,其中为要运行的命令,后面的为传递给命令的选项或参数;然而,此种格式指定的命令不会以"/bin/sh -c"来发起,因此常见的shell操作如变量替换以及通配符替换将不会进行;不过,如果要运行的命令依赖于此shell特性的话,可以将其替换为类似下面的格式。

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

CMD

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

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

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

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

CMD

CMD ["","",""] 或

CMD ["",""]

前两种格式的意义同RUN

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

ENTRYPOINT

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

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

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

格式:

ENTRYPOINT

ENTRYPOINT ["","",""]

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

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

USER

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

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

格式:

USER |

需要注意的是,可以为任间数字,但实践中其必须为/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 || exit 1

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:数据查询优化技术方案
下一篇:深挖 Go 之 for-range 排坑指南
相关文章

 发表评论

暂时没有评论,来抢沙发吧~