肥宅钓鱼网
当前位置: 首页 钓鱼百科

dockerfile运行教程(使用Dockerfile创建镜像)

时间:2023-06-17 作者: 小编 阅读量: 1 栏目名: 钓鱼百科

在上面的内容中介绍了如何使用dockercommit的方法来构建镜像,相反推荐使用被称为Dockerfile的定义文件和dockerbuild命令来构建镜像。最后设置EXPOSE指令,这条指令告诉Docker该容器内的应用程序将会使用容器的指定端口,这并不意味着可以自动访问任意容器运行中服务的端口,这里指定的是80端口。FROM指令可以支持由其上一个指令ARG指令声明的变量,并传递给FROM指令使用。CMD和使用dockerrun命令启动容器时指定运行命令几乎一致。

在上面的内容中介绍了如何使用docker commit的方法来构建镜像,相反推荐使用被称为Dockerfile的定义文件和docker build命令来构建镜像。Dockerfile使用基本的基于DSL语法的指令来构建一个Docker镜像,之后使用docker build命令基于该Dockerfile中的指令构建一个新的镜像。

第一个Dockerfile

现在来创建一个最简单的Dockerfile文件样例,先创建一个空的Dockerfile文件,在任意目录下都行,在Dockerfile文件中填入以下内容。

FROM alpine:3.14 //设置容器内的数据卷 VOLUME ["/var/html"] EXPOSE 80

该Dockerfile由一系列指令和参数组成,每条指令,如FROM,都必须为大写字母且后面跟随一个参数:FROM alpine:3.14,Dockerfile中的指令会按顺序从上到下执行,所以应该根据需要合理安排指令的顺序。

使用build命令构建镜像的步骤如下 :

第一步:Docker从基础镜像运行一个容器。

第二步:执行数据卷指令来创建一个数据卷。

第三步:设置访问端口

最后所有指令执行完毕。

每个Dockerfile的第一条指令都应该是FROM,FROM指令指定一个已经存在的镜像后续指令都将基于该镜像进行,这个镜像被称为基础镜像(base iamge)。在上面的Dockerfile示例中,我们指定了alpine:3.14作为镜像的基础镜像,基于这个Dockerfile构建的新镜像将以alpine:3.14操作系统为基础,在运行一个容器时,必须要指明是基于哪个基础镜像在进行构建。

接着是VOLUME指令,用于指定数据卷的设置。

最后设置EXPOSE指令,这条指令告诉Docker该容器内的应用程序将会使用容器的指定端口,这并不意味着可以自动访问任意容器运行中服务的端口,这里指定的是80端口。

Dockerfile指令

本小节主要针对Dockerfile文件中使用到的指令进行介绍,介绍Dockerfiler文件中常用的指令,在Dockerfile文件中所有的指令都必须使用大写。

1.FROM

FROM指令的格式如下:

FROM [--platform=<platform>] <image> [AS <name>] ORFROM [--platform=<platform>] <image>[:<tag>] [AS <name>] ORFROM [--platform=<platform>] <image>[@<digest>] [AS <name>]

FROM指令表示初始化一个新构建并作为后续指令的基本映像,所以一个有效的Dockerfile文件必须以FROM指令开始,为个镜像也必须是一个有效镜像,可以从一些公用库中来获取相应的镜像。

但ARG可以放在FROM指令前面,关于ARG和FROM如何交互将会在后面介绍。

FROM可以在单个Dockerfile中多出现,这样可以创建多个映像,或将一个构建阶段用作另一个构建阶段的依赖库。

FROM指令可以支持由其上一个指令ARG指令声明的变量,并传递给FROM指令使用。

ARG CODE_VERSION=latest FROM base:${CODE_VERSION} CMD /code/run-app FROM extras:${CODE_VERSION} CMD /code/run-extras

2.RUN

RUN指令有两种运行方式:

#shell格式: RUN <command> #exec格式: RUN ["executable", "param1", "param2"] # 例如: # RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

注意:Dockerfile的指令每执行一次都会在docker上新建一层,所以过多无意义的层,会造成镜像膨胀过大。

如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。

3.CMD

CMD指令用于指定一个容器启动时所运行的命令,这有点类似于RUN指令,但RUN指令是指定镜像被构建时要运行的命令,而CMD是指容器启动时所要运行的命令,CMD指令有三种形式。

#exec格式 CMD ["executable","param1","param2"] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数 CMD ["param1","param2"] #shell格式 CMD command param1 param2

一般推荐使用第一种格式,执行过程清晰明确。第三种格式其实在运行过程中也会转换成第一种格式运行,并且默认可执行文件是sh。

CMD和使用docker run命令启动容器时指定运行命令几乎一致。

#如在Dockerfile文件中写以下指令 CMD ["/bin/true"] #上面这个CMD等同以下面的run指令 root@ubunhomhome/test# docker run -it nginx /bin/true

在Dockerfile中只能有一个CMD指令,即使如果有多个CMD指令,也只有最后一个CMD才会生效。

CMD指令主要是为执行中的容器提供默认值,这些默认值可以包含可执行文件,也可以省略可执行文件,在这种情况下,就必须指定一条ENTRYPOINT指令。

如果用户在使用docker run指定参数时,则它们将会覆盖Dockerfile文件中的CMD参数默认值。

4.LABEL

LABEL指令用来给镜像添加一些元数据(metadata),以键值对的形式,语法格式如下:

LABEL <key>=<value> <key>=<value> <key>=<value> ...

如果LABEL值中需要跨多行,则需要加入反斜杠和引号。

一个镜像可以有多个标签,可以在一行上指定多个标签,有以下两种方式可以实现。

5.EXPOSE

该指令用于声明监听的端口号,在监听是可以指定是TCP还是UDP协议,默认值为TCP,其主要有以下作用:

帮助镜像使用理解这个镜像服务的守护端口,以方便配置映射。

在运行时使用随时端口映射,也就是docker run -P时,会自动随机映射EXPOSE的端口。

EXPOSE指令实际上并未发布指定端口,它是将我们访问时输入的端口和运行容器之间做一种关联或通信,具体发布哪些端口,要在运行容器时发布实际端口,可以使用docker run中-p或-P来设置映射的端口号。

默认情况下一般如果我们未指定协议的话,那么都是使用TCP协议,当然也可以指定具体的协议,也可以同时指定TCP和UDP协议。

EXPOSE 80/tcp EXPOSE 80/udp

6.ENV

设置环境变量,定义了环境变量,这样在后续的指令中,就可以使用这个环境变量。如果在环境变量引用过程中包含空格,那么需要使用到反斜杠。

其语法格式如下:

ENV <key> <value> ENV <key1>=<value1> <key2>=<value2>... ENV MY_NAME="John Doe" ENV MY_DOG=Rex\ The\ Dog ENV MY_CAT=fluffy

使用ENV设置的环境变量会保留下来,当容器运行时可以使用docker inspect查看值,并且可以使用docker run --env = 更改环境变量的值。

如果仅仅是在构建过程中需要环境变量,而在最终映像中不需要,可以考虑为单个命令设置一个值或使用ARG,ARG指令不会人保留在最终镜像中。

ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y ...

7.ARG

ARG构建参数与ENV作用一致,不过作用域不一样,ARG设置的环境变量仅对Dockerfile内有效,也就是说只有docker build的过程中有效,构建好的镜像内不存在此环境变量。

构建命令docker build中可以用--build-arg <参数名>=<值>来覆盖,ARG指令格式如下:

ARG <参数名>[=默认值]

如果ARG指令具有默认值,并且在构建时未传递任何值,则构建时会使用默认值,相反如果未设置默认值,并且在构建中未传递任何值,那么构建时会输出警告信息。

8.ADD

ADD指令是指将宿主机的文件或目录复制到镜像文件系统中指定的路径,其语法格式有两种:

ADD [--chown=<user>:<group>] <src>... <dest> ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]

每个可以使用通配符,并且匹配将使用Go的filepath.Match规则进行,例如:

要添加所有以“hom”开头的文件:

ADD hom* /mydir/

“?”可以替换任意一个字符,例如:

ADD hom?.txt /mydir/

是指构建容器的路径,可以是绝对路径,也可以是相对路径,但这个相对路径是相对于WORKDIR的路径。如以下示例是将“test.txt”文件添加到/relativeDir/。

ADD test.txt relativeDir/

下面的示例则是将“test.txt”添加到相对路径/absoluteDie/中。

ADD test.txt /absoluteDir/

如果路径中包含一些特字符,那么需要按照Golang规则转义那些路径,以防止在解析过程中将它们视为匹配的模式,如要添加名为sarr[1].txt的文件。

ADD sarr[[]1].txt /mydir/

路径必须是构建内容的一个内部路径,不能添加类似于ADD ../path /path,因为docker build的第一步是将上下文目录和子目录发送到docker守护进程。

如果是URL,而不以斜杠结尾,则从URL下载文件并将其复制到。

如果是URL,而以斜杠结尾,则从URL推断文件名,并将文件下载到/,例如ADD http://chuanshi.com/foobar /,将创建文件/foobar,该URL必须具有正确的路径,以便在这种情况下可以找到适当的文件名。

如果是目录,则复制目录的整个内容,包括文件系统元数据。

如果是任何其他类型的文件,则会将其及其元数据一起单独复制,在这种情况下,如果以斜杠结尾,则它将被视为目录,并且的内容将被写在/base()中。

如果直接或由于使用通配符而指定多个资源,则必须是目录,并且必须以斜杠结尾。

如果不以斜杠结尾,则将其视为常规文件,并且的内容将被写入。

如果不存在,则会与路径中所有缺少的目录一起创建它。

1.ADD的优点:在执行为tar压缩文件的话,压缩格式为gzip、gzip2以及xz的情况下,会自动复制并解压到。

2.ADD的缺点:在不解压的前提下,无法复制tar压缩文件,会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢,具体是否使用,可以根据是否需要自动解压来决定。

9.COPY

复制指令,从上下文目录中复制文件或者目录到容器里指定路径,通常有以下两种格式:

COPY [--chown=<user>:<group>] <src>... <dest> COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]

COPY指令表示从复制新文件或目录,并将它们添加到容器的文件系统中,路径为。

可以指定多个资源,但是文件和目录的路径将被解释为相对于构建上下文。

每个可能包含通配 符,并且匹配将合作Go人filepath.Match规则进行。

例如要添加所有"hom"开头的文件:

COPY home* /mydir/

"?"表示可以匹配任意一个字符:

COPY hom?.txt /mydir/

是指构建容器的路径,可以是绝对路径,也可以是相对路径,但这个相对路径是相对于WORKDIR的路径。如以下示例是将“test.txt”文件添加到/relativeDir/。

COPY test.txt relativeDir/

下面的示例则是将“test.txt”添加到相对路径/absoluteDie/中。

COPY test.txt /absoluteDir/

如果路径中包含一些特字符,那么需要按照Golang规则转义那些路径,以防止在解析过程中将它们视为匹配的模式,如要添加名为sarr[1].txt的文件。

COPY sarr[[]1].txt /mydir/

路径必须是构建内容的一个内部路径,不能添加类似于COPY ../path /path,因为docker build的第一步是将上下文目录和子目录发送到docker守护进程。

如果是目录,则复制目录的整个内容,包括文件系统无数据,目录本身不会被复制,只是其内容被复制。

如果是任何其他类型的文件,则会将其及其元数据一起单独复制,在这种情况下,如果以斜杠结尾,则它将被视为目录,并且的内容将被写在/base()中。

如果直接或由于使用通配符而指定多个资源,则必须是目录,并且必须以斜杠结尾。

如果不以斜杠结尾,则将其视为常规文件,并且的内容将被写入。

如果不存在,则会与路径中所有缺少的目录一起创建它。

10.ENTRYPOINT

类似于CMD指令,但其不会被docker run指令运行参数所覆盖,并且这些命令行参数会被当作参数送给ENTRYPOINT指令指定的程序。

但是如果运行docker run时使用了--entrypoint选项,将覆盖CMD指令指定的程序。

其语法格式有以下两种:

#exec格式 ENTRYPOINT ["executable", "param1", "param2"] #shell格式 ENTRYPOINT command param1 param2

ENTRYPOINT的优点在执行docker run的时候可以指定ENTRYPOINT运行所需要的参数。

但如果Dockerfile中如果存在多个ENTRYPOINT指令时,只有最后一个会生效。

可以将ENTRYPOINT与CMD命令搭配使用,一般是变参才会使用CMD,这里的CMD等于是在给ENTRYPOINT传参。

例如,通过Dockerfile构建了一个nginx:V1.0的镜像。

FROM nginx ENTRYPOINT ["nginx", "-c"] # 定参 CMD ["/etc/nginx/nginx.conf"] # 变参

如果在运行容器时,不传参运行,

root@ubunhomhome/test# docker run -it nginx:v1.0

容器内则会默认运行以下命令,启动主进程。

nginx -c /etc/nginx/nginx.conf

如果在运行容器时传参运行,

root@ubunhomhome/test# docker run -it nginx:v1.0 -c /etc/nginx/new_nginx.conf

容器内会默认运行以下命令,启动主进程。

nginx -c /etc/nginxnew_nginx.conf

11.VOLUME

VOLUME指令在后面的章节会进行详细的介绍,在本小节中不做介绍

12.USER

USER指令用于指定执行后续命令的用户和用户组,这边只是切换后续指令执行的用户(用户和用户组必须提前已经存在)。其语法格式如下:

USER <user>[:<group>] #or USER <UID>[:<GID>]

13.WORKDIR

WORKDIR指令表示指定工作目录,该指定的目录必须提前创建好,docker build构建镜像过程中的,每个RUN命令都是新建的一层,只有通过WORKDIR创建才会一直存在。其语法格式如下:

WORKDIR /path/to/workdir

WORKDIR指令可在Dockerfile中多次使用,如果提供了相对路径,则它将相对于上一个WORKDIR指令的路径来创建目录,如:

WORKDIR /a WORKDIR b WORKDIR c RUN pwd

该Dockerfile中最后一个pwd命令的输出为/a/b/c。

WORKDIR指令也可以解析ENV设置的环境变量,如:

ENV DIRPATH=/path WORKDIR $DIRPATH/$DIRNAME RUN pwd

该Dockerfile中最后一个pwd命令的输出为/path/$DIRNAME。

    推荐阅读
  • 鸡鸭鹅都是家畜吗(鸡鸭鹅的祖先早已灭绝)

    中国人对于鸭子的爱涌动在舌尖,不同的烹饪和食用方式,也孕育出了五花八门的家鸭品种。家鸭Anasplatyrhynchosdomestica家鸭的祖先,是广泛分布于北半球的绿头鸭Anasplatyrhynchos。这种鸭子驯化于南美洲的疣鼻栖鸭Cairinamoschata,由于它的体型更大,产肉率更高,食物转化率更强,所以在我国南方部分地区逐渐取代了由绿头鸭驯化而来的家鸭,成为新的主流家禽种类。欧洲家鹅Anseranserdomesticus亚洲家鹅的祖先,是鸿雁Ansercygnoides。

  • 蜂王浆冷冻可以保存多久(蜂王浆冷冻的保存时间)

    以下内容希望对你有帮助!蜂王浆冷冻可以保存多久4℃左右保存时间为3个月,-5℃左右保存时间为一年,-18℃以下保存时间为两年以上。蜂王浆含有蛋白质、脂肪、糖类、维生素A、维生素B维生素B叶酸、泛酸及肌醇,还有类似乙酰胆碱样物质,以及多种人体需要的氨基酸和生物激素等,适量食用对身体有益。

  • 瘦子为什么吃不胖(瘦子为什么吃不胖纪录片百度网盘)

    筋、骨构成人的基本框架,体重的轻重是取决于我们人类的脾胃系统。脾虚瘦是机体收支不平衡造成的。肥胖往往是脾虚造成的,其实消瘦也是因为脾虚。肝经入腹以后“挟胃,属肝络胆,上贯膈,布胁肋”,就是说肝经是包绕着胃的,所以肝经必须较为宽松,胃才能容物。如果肝郁不畅,肝经是紧缩的,胃口肯定打不开。如果体重在短时间内出现急剧下降,需要去医院做系统的检查,以除外恶性疾病。

  • 吃百香果能吃海鲜吗(吃百香果可以吃海鲜吗)

    海鲜中含有五价砷,这种物质对人体是无毒的,但是百香果中含有的维生素C可以将五价砷转换为有毒的三价砷,进而对身体造成一定的伤害,所以吃海鲜的时候不要吃太多的百香果以及其他维生素C含量丰富的食物。

  • 王者荣耀鸿胪演武回城特效怎么获得(王者荣耀鸿胪演武回城特效如何获得)

    打开王者荣耀后,点击开始游戏进入后点击右侧的活动然后找到燎原之心活动,点击打开默契值达到180,即可获得鸿胪演武回城特效,我来为大家科普一下关于王者荣耀鸿胪演武回城特效怎么获得?王者荣耀鸿胪演武回城特效怎么获得打开王者荣耀后,点击开始游戏。《传说对决》,即《王者荣耀》的欧美版本于2018年在任天堂Switch平台发售。

  • 生漆正确调制方法(生漆正确调制方法是什么)

    测重的简便方法是:将用于配色的两种以上的色漆分别装入容器巾,光秤其毛重,调色完成后再秤——次,两次秤量之差,即求得用于配色的各种色漆的重量。调制时,应先加入主色漆,再以着色力较强的色漆为副色,慢慢地、断续地加入主色漆内,并不断搅拌。调配天蓝色漆,也是要先将白色漆调人容器内,再逐渐加入蓝色漆直到满意为止。加入不同分量的黑色,可得到亮度不同的各色色彩,如灰色、棕色、褐色、草绿等即可。

  • 什么样的蜂蜜是好蜂蜜 什么样的蜂蜜是最好的蜂蜜

    蜂蜜结晶细腻的是好蜜,颗粒感强的可能是白糖沉淀。

  • 为什么偶像剧都是学霸和学渣一对(清华的整体智商都被这部剧拉低了)

    林笑笑明知孩子可能患有癫痫,还坚持把他生下来。我是理解不了这个走向林笑笑有两个好朋友,潘芝芝(张歆艺),春妮(秦岚)。本来挺喜欢张歆艺,在剧中是破坏别人家庭的小三,因为害死了正房,把那个男人介绍给了自己的好朋友春妮(秦岚),从此秦岚背上了巨大的黑锅,狐狸精的罪名。。后来听说剧情是张歆艺又和林笑笑抢男主,这部剧简直不能更乱啊。。。剧中秦岚和丈夫结婚后,丈夫的女儿爱上了50多岁的大叔,看着比他爸还老。。

  • 男人常常冒虚汗是什么原因(男人睡觉的时候常出虚汗)

    在睡觉的时候,有出汗的情况,常常会称之为盗汗。肾出现问题引起的盗汗,其实就是一方面,还有其他因素引起的,需要查明原因,才可以针对性改善。糖尿病人群在早期的时候,就容易出现盗汗的情况,需要注意血糖的控制。还有高血压人群,夜间本是血压处于低谷的时候,若是升高,自然会刺激到身体,出现盗汗的情况,提醒你需要注意身体的调理了,减少损害的出现。

  • 粉丝金针菇蒜蓉蒸扇贝的做法(海鲜34)

    鲅鱼的价格还便宜了一些16元一斤,新鲜黄花鱼几乎不见踪迹。只有虾、蟹比封海前贵不少,鲜活爬虾50一斤,梭子蟹更贵,要200多一斤。相比之下,各种贝类依然是海鲜市场货源最充足、买卖最活跃、价格最便宜的一抹亮色,个头大、肉饱满的扇贝卖4元一斤,现在还是扇贝肥美的时候,于是又买了两斤回家做晚餐。这个操作有点难度,最好是带手套操作,将扇贝肉洗净后放碗里,倒进料酒腌制十五分钟。