Dockerfile详解 Dockerfile是一个构建镜像的文本文件,其中包含用户可以在命令行上调用组装镜像的所有命令,使用dockerbuild构建 格式:CommentINSTRUCTIONargumentsFROM 镜像构建初始阶段,指定构建的新镜像是从哪个基础镜像构建FROM〔platformplatform〕image〔:tag〕〔ASname〕RUN 执行命令,在构建镜像时执行,有以下2种格式: shell格式RUN命令行命令命令行命令等同于,在终端操作的shell命令。 exec格式RUN〔可执行文件,参数1,参数2〕举例RUN〔binbash,c,echohello〕等价于RUNbinbashcechohello 注意:Dockerfile每执行一次都会在docker上新建一层,过多无意义的层,会导致镜像过于膨大 举例:FROMcentosRUNyumyinstallwgetRUNwgetOredis。tar。gzhttp:download。redis。ioreleasesredis5。0。3。tar。gzRUNtarxvfredis。tar。gz 以上创建3层镜像,优化如下:FROMcentosRUNyumyinstallwgetwgetOredis。tar。gzhttp:download。redis。ioreleasesredis5。0。3。tar。gztarxvfredis。tar。gz 以符号连接命令,执行后只会创建一层镜像LABEL 给镜像添加元数据,比如说镜像作者,以keyvalue形式声明LABELkeyvaluekeyvaluekeyvalue。。。LABELcom。example。vendorACMEIncorporatedLABELcom。example。labelwithvaluefooLABELversion1。0LABELdescriptionThistextillustratesthatlabelvaluescanspanmultiplelines。EXPOSE 指定容器监听的端口,可以指定TCP或UDP,默认是TCPEXPOSEport〔portprotocol。。。〕EXPOSE80tcpEXPOSE80udpENV 环境变量设置,值会持久化在镜像中,会产生一定副作用,ARG不会ENVkeyvalue。。。ENVWORKDIRappWORKDIR{WORKDIR}ADD 复制文件、目录到镜像文件文件系统中,可使用通配符。该指令有以下两种格式ADD〔chownuser:group〕src。。。destADD〔chownuser:group〕〔src,。。。dest〕复制test。txt文件到容器home目录ADDtest。txthomeCOPY 复制文件、目录到镜像文件文件系统中,可使用通配符。COPY与ADD类似,首选推荐使用COPY。COPY只支持本地文件或目录复制到容器中,而ADD会自动解压本地压缩文件。该指令有以下两种格式COPY〔chownuser:group〕src。。。destCOPY〔chownuser:group〕〔src,。。。dest〕ENTRYPOINT 容器启动时执行命令,有以下2种格式:ENTRYPOINT〔executable,param1,param2〕推荐用法ENTRYPOINTcommandparam1param2 用例:FROMopenjdk:11COPY。jarappapp。jarENVTZAsiaShanghaiWORKDIRappEXPOSE8761ENTRYPOINT〔java,jar,app。jar〕CMD 容器启动时执行命令,有以下2种格式:CMD〔executable,param1,param2〕(execform,thisisthepreferredform)CMD〔param1,param2〕(asdefaultparameterstoENTRYPOINT)CMDcommandparam1param2(shellform) 组合使用ENTRYPOINT和CMD,ENTRYPOINT指定默认的运行命令,CMD指定默认的运行参数。 用例: ENTRYPOINT和CMD组合使用构建一个ping镜像,容器运行后默认pinglocalhostFROMubuntu:trustyENTRYPOINT〔binping,c,3〕CMD〔localhost〕 构建ping镜像,并运行ping容器dockerbuildtping。dockerrunpingPINGlocalhost(127。0。0。1)56(84)bytesofdata。64bytesfromlocalhost(127。0。0。1):icmpseq1ttl64time0。025ms64bytesfromlocalhost(127。0。0。1):icmpseq2ttl64time0。038ms64bytesfromlocalhost(127。0。0。1):icmpseq3ttl64time0。051msdockerrunpingwww。baidu。comPINGwww。a。shifen。com(180。101。49。11)56(84)bytesofdata。64bytesfrom180。101。49。11(180。101。49。11):icmpseq1ttl52time10。5ms64bytesfrom180。101。49。11(180。101。49。11):icmpseq2ttl52time24。1ms64bytesfrom180。101。49。11(180。101。49。11):icmpseq3ttl52time15。4msVOLUME VOLUME方式挂载到宿主机上的是匿名卷,在宿主机上是自动匿名挂载到varlibdockervolumes目录下VOLUME〔data〕USER 用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)USERuser〔:group〕WORKDIR 为容器指定工作目录,如果该目录不存在,则创建容器时会创建WORKDIRpathtoworkdirARG 定义一个变量,用户在构建镜像时使用dockerbuildbuildarg将变量传递给构造器。如果用户指定了未在Dockerfile中定义的构造参数,会输出警告。ARGname〔defaultvalue〕 用例:FROMubuntuARGCONTIMGVERENVCONTIMGVERv1。0。0RUNechoCONTIMGVERdockerbuildbuildargCONTIMGVERv2。0。1。