当前位置: 首页 > 科技观察

Dockerfile详解

时间:2023-03-11 23:38:45 科技观察

Docker可以通过阅读Dockerfile中的指令自动构建镜像。Dockerfile是一个文本文档,其中包含用户创建图像的所有命令和说明。1.变量用$variable_name或${variable_name}表示。${variable:-word}表示如果设置了变量,结果将是该值。如果未设置变量,则word将是结果。${variable:+word}如果设置了变量,则表示单词结果,否则为空字符串。变量可以转义成普通字符串,前面加上\:\$foo或\${foo},这意味着转换为$foo和${foo}文字。2.FROM初始化一个新的构建阶段并设置基础镜像:FROM[--platform=][AS]FROM[--platform=][:][AS]FROM[--platform=][@][AS]单个Dockerfile可以多次出现FROM以将前一个构建阶段用作另一个dependencyASnameofaconstructionphase表示构建阶段的名称。该术语可用于后续的FROM和COPY--from=指令。本阶段构建的镜像摘要引用,实际上是根据镜像内容生成的ID,只要图像内容不变,摘要和标签或摘要值都不是可选的。如果您省略其中任何一个,构建器将默认使用最新标签。如果找不到标记值,构建器将返回错误。如果FROM引用多平台图像,则--platform标志可用于指定平台。例如,linux/amd64、linux/arm64或windows/amd64。3.RUN会在当前镜像之上的新层执行命令,docker构建时运行。RUN/bin/bash-c'source$HOME/.bashrc;\echo$HOME'RUN有两种形式:RUN(shell形式,命令在shell中运行,默认/bin/sh-c是inLinuxorcmd/S/ConWindows)RUN["executable","param1","param2"](executableform)说明:可以使用\(反斜杠)将单条RUN指令继续到下一行RUN期间下一次构建时,指令缓存不会自动失效。您可以使用--no-cache标志使指令缓存无效。Dockerfile的指令每次执行都会在Docker上创建一个新层。因此,过多无意义的图层会导致图像膨胀过大。您可以使用&&符号来连接命令。执行此操作后,只会创建一层图像。RUN在dockerbuild期间运行。FROMubuntuCMD["/usr/bin/wc","--help"]支持三种格式:CMD["executable","param1","param2"]使用exec执行,推荐方式;/bin/sh中的CMD命令param1param2,提供给需要交互的应用程序;CMD["param1","param2"]是提供给ENTRYPOINT的默认参数。指定启动容器时要执行的命令。每个Dockerfile只能有一个CMD命令。如果指定了多个命令,则只执行最后一个命令。如果用户在启动容器时指定要运行的命令,CMD指定的命令将被覆盖。5.LABEL添加元数据:LABELmulti.label1="value1"\multi.label2="value2"\other="value3"6.EXPOSEEXPOSE[/...]Docker容器运行到监听指定的网络端口。您可以指定端口是侦听TCP还是UDP。如果不指定协议,则默认为TCP。EXPOSE指令实际上并不发布端口。要在运行容器时实际发布端口,dockerrun-P发布和映射一个或多个端口。默认情况下,EXPOSE假定TCP。您还可以指定UDP:EXPOSE80/udpVII。ENV设置环境变量:ENV=...设置的环境变量会一直存在,可以使用dockerinspect查看。使用dockerrun--env=更改环境变量的值。如果仅在构建期间需要环境变量,请考虑为单个命令设置一个值:RUNDEBIAN_FRONTEND=noninteractiveapt-getupdate&&apt-getinstall-y...或者使用ARG,它不会保留在最终图像中:ARGDEBIAN_FRONTEND=noninteractiveRUNapt-getupdate&&apt-getinstall-y...八、ADD复制新文件、目录或远程文件URL,并将它们添加到可以指定多个资源,但如果它们是文件或目录,它们的路径将被解释为相对于构建上下文的源,即WORKDIR。每个可能包含通配符,匹配将使用Go的filepath.Match规则。示例:添加所有以“hom”开头的文件:ADDhom*/mydir/在下面的示例中,?替换为任何单个字符,例如“home.txt”。ADDhom?.txt/mydir/是绝对路径,或相对于WORKDIR。9、COPY的语法与ADD相同,复制、复制文件。COPY命令和ADD命令的唯一区别是是否支持从远程URL获取资源。COPY命令只能从执行dockerbuild的宿主机上读取资源复制到镜像中。ADD命令还支持通过URL从远程服务器读取资源并复制到镜像中。同样的需求,推荐使用COPY命令。ADD命令更擅长读取本地tar文件并解压缩它们。10.ENTRYPOINTENTRYPOINT和CMD一样,是指定容器启动程序和参数,但不会被dockerrun的命令行参数指定的指令覆盖。如果要覆盖,需要通过dockerrun--entrypoint指定。它有2种格式:ENTRYPOINT["executable","param1","param2"]ENTRYPOINTcommandparam1param2指定ENTRYPOINT后,将CMD的内容作为参数传递给ENTRYPOINT命令,真正执行时会变成:11.VOLUME创建一个指定名称的挂载数据卷。VOLUME["/var/log/"]VOLUME/var/log主要作用是:避免重要数据因容器重启而丢失,避免容器增长。12.ARG定义了变量,其功能与ENV相同,但ARG变量不像ENV变量那样持久化到构建的镜像中。ARG[=]Docker有一组预定义的ARG变量,您可以在Dockerfile中没有相应指令的情况下使用这些变量。HTTP_PROXYhttp_proxyHTTPS_PROXYhttps_proxyFTP_PROXYftp_proxyNO_PROXYno_proxy要使用这些,请使用--build-arg标志在命令行上传递它们,例如:dockerbuild--build-argHTTPS_PROXY=https://my-proxy.example.com.thirteen,ONBUILD向图像添加触发指令,以便稍后在该图像用作另一个构建的基础时执行。也就是说,它是在另一个dockerfileFROM图像时执行的。ONBUILDADD./app/srcONBUILDRUN/usr/local/bin/python-build--dir/app/src十四、STOPSIGNAL设置将发送给容器退出的系统调用信号。该信号可以是与内核系统调用表中某个位置匹配的有效无符号数,例如9,或者是SIGNNAME形式的信号名称,例如SIGKILL。STOPSIGNAL信号的默认停止信号是SIGTERM。当docker停止时,它会将这个信号发送给容器中PID为1的进程。通过--stop-signal,你可以设置你需要的信号。主要目的是让容器中的应用在收到信号后,可以先处理一些事情,实现容器的顺利退出。如果不做任何处理,容器会在一段时间后强制退出,造成业务强制中断。默认时间为10秒。15.HEALTHCHECK用于指定一个程序或命令来监控Docker容器服务的运行状态。HEALTHCHECK指令有两种形式:HEALTHCHECK[OPTIONS]CMD命令(通过在容器内运行命令来检查容器的健康状况)HEALTHCHECKNONE(禁用从基础映像继承的任何健康检查)16.SHELL覆盖用于command表单的默认shell。默认shell在Linux上是["/bin/sh","-c"],在Windows上是["cmd","/S","/C"]。SHELL["executable","parameters"]SHELL指令在Windows上特别有用,它有两个常见但不同的本机SHELL:cmd和powershell,以及可用的备用shell,包括sh。SHELL指令可以出现多次。每条SHELL指令都会覆盖所有先前的SHELL指令并影响所有后续指令。十七、WORKDIR工作目录,如果WORKDIR不存在,即使在后续的Dockerfile指令中不使用,也会创建。在dockerbuild镜像构建过程中,每一个RUN命令都会创建一个新层。只有通过WORKDIR创建的目录才会保留。可以设置多个WORKDIR,如果提供了相对路径,则会相对于上一个WORKDIR指令的路径。例如:WORKDIR/aWORKDIRbWORKDIRcRUNpwd最后一个pwd命令的输出是/a/b/c。WORKDIR指令可以解析以前使用的ENV,例如:ENVDIRPATH=/pathWORKDIR$DIRPATH/$DIRNAMERUNpwd最后一个pwd命令的输出是/path/$DIRNAME。18.USER设置用户名(或UID)和可选的用户组(或GID)。USER<用户>[:<组>]USER[:]