一、概述Dockerfile是用于构建镜像的文本文件,文本内容包含了构建镜像所需的指令和说明。官方文件:
https://docs . docker . com/engine/reference/builder/docker file示例:
https://github.com/dockerfile/
二。Dockerfile结构Dockerfile结构主要分为四个部分:
基本信息维护者信息镜像操作指令容器启动时执行指令(CMD/ENTRYPOINT)【温馨提示】Dockerfile支持每行一条指令,每条指令可以携带多个参数(支持& & amp),支持使用& ldquo# & ldquo#开头注意(jason文件不支持# comment),但不一定要满足以上四点。
三。通用Dockerfile操作指令ARG & mdash& mdash定义在创建镜像过程中使用的变量,在FROM之前只能定义一个。来自& mdash& mdash基于镜像,FROM之前只能有一个或多个ARG指令。MAINTAINER(已弃用)& mdash& mdash镜像维护者的姓名或电子邮件地址。音量& mdash& mdash将容器挂载点指定到由主机或其他容器运行自动生成的目录& mdash& mdash在镜像中执行命令,就像在liunx中执行命令一样,只需要在前面加上RUN关键字。复制& mdash& mdash将本地(主机)上的文件复制到镜像。添加& mdash& mdash并将(主机)上的压缩文件复制并解压缩到映像。ENV & mdash& mdash设置环境变量。工作目录& mdash& mdash为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录意味着切换目录。用户& mdash& mdash为run、CMD和ENTRYPOINT执行命令指定运行用户。暴露& mdash& mdash集装箱的申报服务港口(刚申报)。CMD & mdash& mdash对于容器启动后执行的命令,多个cmd只会执行最后一个。与ENTRYPOINT不同,CMD可以作为ENTRYPOINT的参数,并且会被yaml文件中的命令覆盖。ENTRYPOINT & mdash& mdash当容器启动时,只执行最后一个命令。HEALTHCHECH & mdash& mdash健康检查。ONBUILD & mdash& mdash其后是其他指令,如运行、复制等。,在构建当前映像时不会执行。只有当当前图像被用作构建下一级图像的基础图像时,它才会被执行。标签& mdash& mdashLABEL指令用于向镜像添加一些元数据,并以键值对的形式替换维护者。
1)Docker Build Docker Build -T Text:v 1.--no-cache #要在构建后将映像标记到多个存储库,请添加多个参数Docker Build -tshykes/myapp:1 . 0 . 2-tshykes/myapp:最新。# # #参数解释# -t:指定图像名称#。:当前目录Dockerfile# -f:指定Dockerfile路径# --no4。
2)运行容器测试(docker run)#非交互运行Docker Run Centos:7 . 4 . 1708/bin/echo " Hello World " # #交互执行# -t:在新容器中指定一个伪终端或终端。#-i:允许您与容器中的标准输入(STDIN)进行交互。#会登录docker环境,交互Docker run -It centos:7 . 4 . 1708/bin/bash # -d:后台执行,添加-d参数不会进入容器Docker run -itd centos:7 . 4 . 1708/bin/bash # #进入容器#在使用中4此时,可以通过以下命令进入容器:#docker exec -it:建议您使用docker exec -it命令,因为该命令会退出容器终端,但不会#docker attach:容器的出口将导致容器停止。docker exec -it B2C 0235 DC 53/bin/bash docker attach B2C 0235 DC 53
3)ARG构造参数,与ENV一致。但是范围不同。ARG设置的环境变量只在Dockerfile中有效,也就是说只在docker构建的过程中有效,而这个环境变量在构建的映像中是不存在的。唯一可以在FROM之前定义的。可以用--build -arg := & lt;Value >:要覆盖。语法格式:
ARG & lt参数>:[= & lt;默认值>:]示例:
#在FROM之前定义ARG,它只在FROM中有效。arg version = laser FROM centos:$ { version } #用在FROM之后,所以要重新定义。Arg版本运行echo $ version >;/tmp/image _版本
4)来自定制的图像都是来自基于的图像。[必需]语法格式:
来自[--平台= & amplt;平台& ampgt;]& amp;lt;图像与图像。gt;【AS & amplt;姓名和名称。gt;]FROM[--平台= & amplt;平台& ampgt;]& amp;lt;图像与图像。gt;[:& amp;lt;标签& ampgt;][AS & amp;lt;姓名和名称。gt;]FROM[--平台= & amplt;平台& ampgt;]& amp;lt;图像与图像。gt;[@ & amp;lt;文摘与杂志。gt;][AS & amp;lt;姓名和名称。gt;]如果您引用多平台映像,可选的--平台标志可用于指定映像的平台。来自例如linux/amd64、linux/arm64或windows/amd64。默认情况下,使用构建请求的目标平台。全局构建参数可用于此标志的值,例如,允许您强制该阶段成为本机构建平台(--platform=$BUILDPLATFORM)并使用它来交叉编译到该阶段内的目标平台。示例:
ARG VERSION = latest FROM busybox:$ VERSION # FROM --platform = " Linux/amd64 " busybox:$ VERSION ARG VERSION run echo $ VERSION & gt;图片_版本
5)维护者(已弃用)图像维护者信息语法格式:
维护者& lt名称& gt示例:
LABEL org . open containers . image . authors = " svendoweit @ home . org . au "
6)VOLUME定义了一个匿名数据卷。如果您在启动容器时忘记装载数据卷,它将自动装载到匿名卷。角色:
避免因容器重启而丢失重要数据,这是非常致命的。避免容器越来越大。当开始运行容器docker时,我们可以通过-v参数修改挂载点。语法格式:
#下面的路径是容器中的路径,对应主机的目录是随机卷[" "," & lt路径2 > "...]音量& lt路径>:示例:
摘自ubuntuRUN mkdir/myvolRUN echo《hello world》& gt;/myvol/greetingVOLUME /myvol
7)RUN用于执行命令行命令及其后的命令。语法格式:
RUN (shell形式,命令在shell中运行,默认/bin/sh -c是在Linux或cmd /S /CWindows上)RUN[& quot;可执行文件& quot,& quot参数& quot,& quot参数& quot](执行形式)示例:
#以下三种写法相当于run/bin/bash-c 'source $ home/。bashrc\ echo $ HOME ' run/bin/bash -c ' source $ HOME/。bashrcecho $HOME'RUN ["/bin/bash "," -c "," source $HOME/。bashrcecho $HOME"]
8)COPY将(主机)文件或目录复制到容器中,类似于ADD,但不具备自动下载或解压的功能。所有新文件和目录都是用UID和GID 0创建的,除非可选的--chown标志指定了给定的用户名、组名或UID/GID组合来请求复制内容的特定所有权。语法格式:
COPY[--chown = & lt;用户& gt:& ltgroup & gt]& lt;src & gt...& ltdest & gtCOPY[--chown = & lt;用户& gt:& ltgroup & gt][" & lt;src >;",...“& ltdest >]示例:
#添加所有以“hom”开头的文件:COPY hom* /mydir/#?替换为任意单个字符,如“home.txt”。抄hom?。txt /mydir/#使用相对路径并将“test.txt”添加到
9)添加复制文件或目录到容器中。如果是URL或者压缩包,会自动下载或者解压。ADD指令的用例与COPY类似(相同需求下,官方推荐使用COPY)。这些功能类似,但有以下区别:
ADD的优点:执行时:如果压缩文件是tar,如果压缩格式是gzip、bzip2、xz,会自动复制解压到:。ADD的缺点:tar压缩文件不解压无法复制。这将使镜像构建缓存失效,从而可能会降低镜像构建的速度。是否使用可以根据是否需要自动解压来决定。语法格式:
ADD[--chown = & lt;用户& gt:& ltgroup & gt]& lt;src & gt...& ltdest & gtADD[--chown = & lt;用户& gt:& ltgroup & gt][" & lt;src >;",...“& ltdest >]示例:
#通配符ADD hom* /mydir/#相对路径,将其复制到相对目录/addtest.txt相对目录/#绝对路径ADD test.txt /absoluteDir/#更改权限ADD --chown = 55:mygroup files */work dir/ADD --chown = bin files */somedir/ADD --chown = 1 files */somedir/ADD --chown = 10:11 files */somedir/ADD -chown/ADD与使用场景的区别:
添加支持添加远程url和自动提取压缩文件。仅复制允许从本地计算机复制文件。复制支持从其他构建阶段复制源文件(--from)。根据Dockerfile官方的最佳实践,只有当您确实需要从远程url添加文件或自动提取压缩文件时,才使用add。在其他情况下,使用复制。
10)ENV设置并定义环境变量,因此您可以在后续指令中使用该环境变量。语法格式:
ENV & ltkey1 & gt= & ltvalue1 & gt& ltkey2 & gt= & ltvalue2 & gt...# omit "= "此语法不允许在单个env指令中设置多个环境变量,可能会导致混乱。ENV & ltkey & gt& lt值& gt示例:
ENV _ home =/usr/local/JDK ENV my _ name = " John doe " my _ dog = rex \ the \ dog \ my _ cat = fluffy #此语法不允许在单个ENV指令中设置多个环境变量,可能会造成混乱。ENV JAVA_HOME /usr/local/jdk
11)WORKDIR指定工作目录。WORKDIR指定的工作目录将存在于镜像的每一层中。(必须事先创建WORKDIR指定的工作目录)。语法格式:
工作目录& lt工作目录路径>:示例:
FROM busyboxENV FOO =/bar WORKDIR $ { FOO } # WORKDIR/bar
12)用户用于指定执行后续命令的用户和用户组。这只是用户切换后续命令的执行(用户和用户组必须事先已经存在)。语法格式:
用户& lt用户名>:[:& lt;用户组>:]用户& ltUID & gt[:& lt;GID & gt]示例:
从busybox run group add --system --GID = 9999 admin & amp;& ampuseradd --system --home -dir/home/admin --uid = 9999 --GID = admin adminUSER admin:admin # USER 9999:9999
13)EXPOSE暴露端口,只是声明端口。角色:
帮助镜像用户了解这个镜像服务的守护端口,方便配置映射。在运行时使用随机端口映射时,即docker run -P,EXPOSE的端口会自动随机映射。语法格式:
#默认情况下,EXPOSE采用TCP。暴露& lt端口& gt[& lt;端口& gt/& lt;协议& gt...]示例:
EXPOSE 80/TCP 443/TCP EXPOSE 80 443 EXPOSE 80/TCP EXPOSE 80/UDP
14)CMD类似于RUN指令,都是用来运行程序的,但两者运行的时间点不同:镜像建立时不会执行CMD,而是在容器运行时运行。语法格式:
CMD & lt命令shell >:CMD[" & lt;可执行文件或命令> "," & ltparam 1 >;"," & ltparam 2 >;",...]CMD[" & lt;param 1 >;"," & ltparam 2 >;",...] #编写方法是为ENTRYPOINT指令指定的程序提供默认参数。推荐第二种格式,执行过程清晰。实际上第一种格式在运行过程中会自动转换成第二种格式,默认的可执行文件是sh。示例:
CMD cat/etc/profile cmd ["/bin/sh "," -c ","/etc/profile"]注意:如果Dockerfile中有多个CMD指令,则只有最后一个指令生效。
15)ENTRYPOINT类似于CMD指令,但不会被docker run的命令行参数指定的指令覆盖,这些命令行参数会作为参数发送给ENTRYPOINT指令指定的程序。但是,如果使用--ENTRYPOINT选项运行docker run,ENTRYPOINT指令指定的程序将被覆盖。k8s中的命令还覆盖由ENTRYPOINT指令指定的程序语法格式:
# exec形式,这是首选形式:entrypoint ["executable "," param1 "," param2"] # shell形式:entrypoint命令param1 param2示例:
来自Ubuntu ENTRYPOINT ["top "," -b"] # cmd作为ENTRYPOINT参数CMD ["-c"]#以及下面等价的ENTRYPOINT ["top "," -b -c"] entrypoint top-b -c注意:如果Dockerfile中有多个ENTRYPOINT指令,只有最后一个生效。
16)HEALTHCHECK用于指定一个程序或指令来监控docker容器服务的运行状态。语法格式:
HEALTHCHECK [OPTIONS] CMD命令(通过在容器内运行命令来检查容器的运行状况)HEALTHCHECK NONE(禁用从基本映像继承的任何运行状况检查)选项CMD包括:
--interval=DURATION(默认30s:): interval,frequency --timeout=DURATION(默认30s:):time out --start -period = DURATION(默认0s:):为需要时间引导的容器提供初始化时间,在此期间检测失败将不计入最大重试次数。--重试次数=N(缺省值为3:):重试次数命令的退出状态表明容器的健康状况。可能的值有:
0:健康状态,容器是健康的,准备完成。1:不健康状态,容器工作不正常。2:保持,不要用这个退出代码。示例:
FROM nginxmainer SecurititHEALTHCHECK --interval = 5s --time out = 3s \ CMD curl -f http://localhost/| | exit 1 CMD[" usr/sbin/nginx "," -g ","守护程序关闭;"]
17)onbuilddonbuild是一个特殊的指令,后面是其他指令,比如RUN、COPY等。,在构建当前映像时不会执行。只有当当前图像被用作构建下一级图像的基础图像时,它才会被执行。语法格式:
ONBUILD & lt其他说明>:示例:
从节点:slim run mkdir/appWORKDIR/appon build复制。/package.json /appONBUILD在构建副本上运行[ "npm "," install "]。/app/CMD [ "npm "," start" ]
18)LABELLABEL指令用于以键值对的形式向镜像添加一些元数据。来代替维护者。语法格式:
标签& ltkey & gt= & lt值& gt& ltkey & gt= & lt值& gt& ltkey & gt= & lt值& gt...例如:例如,我们可以添加镜子的作者
标签org . open containers . image . authors = " run OOB "
四。ARG和ENV之间的区别。ARG定义的变量只存在于镜像构建过程中,但在容器启动后不会保留。由ENV定义的变量在容器启动后仍然存在。
动词 (verb的缩写)CMD、ENTRYPOINT、command、args场景测试当用户在kubernetes中的yaml文件中同时写入command和args时,DockerFile中的命令行和参数默认会被覆盖。完整的情况分类如下:
1)没有命令和参数的场景测试。如果既不写命令也不写参数,那么使用DockerFile的默认配置。centos copytest.sh/runchmod+x/test.sh # # # entry point的Dockerfile将/bin/sh -c作为的子命令启动,它不会传递参数。要传递参数,只能传递# ENTRYPOINT ["/bin/sh "," -c ","/test . sh entry point "]entry point["/test . sh "," entry point "]CMD[" CMD "]/tmp/test . sh
#!/bin/bashecho $* build
Docker Build -T Test1:V1 -F Docker文件。YAML安排
cat & lt& ltEOF & gttest1 . yamlapiversion:apps/v1 kind:deployment metadata:name:test spec:replicas:1选择器:matchLabels: app:测试模板:元数据:标签:app:测试规范:nodename:local -168-182-110 containers:-name:test image:test:v1 #命令:['/bin/sh ','/test . sh ']# args:[' args ']of execution
kubectl应用-f测试. yaml
2)命令存在,但参数存在。场景测试如果编写了命令,但没有编写args,那么Docker的默认配置将被忽略,只有。将执行yaml文件(不带任何参数)。cat & lt& ltEOF & gttest 2 . yamlapiversion:apps/v1 kind:deployment metadata:name:test 2 spec:replicas:1 selector:match labels:app:test 2 template:metadata:labels:app:test 2s pec:nodeName:local -168-182-110 containers:-name:test 2 image:test:v1 #['/bin/sh ',' -c ','/test.sh command ',' hello'],添加了'/bin/sh '和' -c '只能这样传递参数,['/bin/sh ',' -c ','/test . sh command '];CMD中的参数将被忽略。命令:['/test.sh'] #命令带参数#命令:['/test.sh ','命令'] #参数:['args'] EOF
3)命令不存在,但场景测试的参数存在。如果没有写command,但是写了args,那么会执行Docker默认配置的ENTRYPOINT的命令行,但是调用的参数是args in。yaml,而且CMD的参数会被覆盖,但是ENTRYPOINT自带的参数还是会被执行。cat & lt& ltEOF & gttest 3 . yamlapiversion:apps/v1 kind:deployment metadata:name:test 3 spec:replicas:1 selector:match labels:app:test 3 template:metadata:labels:app:test 3s pec:nodeName:local -168-182-110 containers:-name:test 3 image:test:v1 #['/bin/sh ',' -c ','/test.sh command ',' hello'],添加了'/bin/sh '和' -c '只能这样传递参数,['/bin/sh ',' -c ','/test . sh command '];CMD中的参数将被忽略# command: ['/test.sh'] # command接受参数# command: ['/test.sh ',' command'] args: ['args'] eof
4)命令和参数都有场景测试。如果命令和参数都被写入,那么Docker的默认配置将被忽略,而。使用yaml。cat & lt& ltEOF & gttest 4 . yamlapiversion:apps/v1 kind:deployment metadata:name:test 4 spec:replicas:1 selector:match labels:app:test 4 template:metadata:labels:app:test 4s pec:nodeName:local -168-182-110 containers:-name:test 4 image:test:v1 #['/bin/sh ',' -c ','/test.sh command ',' hello'],添加了'/bin/sh '和' -c '只能这样传递参数,['/bin/sh ',' -c ','/test . sh command '];CMD中的参数将被忽略# command: ['/test.sh'] # command带参数,command和args都带command: ['/test.sh ',' command ']args:[' args ']EOF镜像构建Dockerfile介绍到此为止!
这就是这篇关于Docker镜像构造的保姆级实用指南的文章。关于Docker镜像构造的更多信息,请搜索主机频道zhujipindao之前的文章。或者继续浏览下面的相关文章。希望大家支持主机频道zhujipindao。以后多来com!
评论前必须登录!
注册