Docker学习笔记⼗:Dockerbuild,COPY和ADD
Docker build命令详解
Dockerfile创建完成后,可以使⽤docker build命令根据Dockerfile构建⼀个镜像。在上⼀关中,我们在Dockerfile所在的⽂件夹下执⾏docker build -t myimage .这条命令,然后镜像就被构建了。现在我们来详细地将这条命令。该docker build的命令格式如下:
docker build [OPTIONS] 上下⽂路径|URL
其中:
docker build: ⽤Dockerfile构建镜像的命令关键词;
-[OPTIONS]: 命令选项,常⽤的指令包括-t指定镜像的名字,-f显⽰指定Dockerfile,如果不使⽤-f,则默认将上下⽂路径下的名为Dockerfile的⽂件认为是构建镜像的“Dockerfile”;
上下⽂路径|URL: 指定构建镜像的上下⽂的路径,构建镜像的过程中,可以且只可以引⽤上下⽂中的任何⽂件。
现在让我们在看看docker build -t myimage .这条命令,在这条命令中,使⽤-t指定了镜像名为myimage,由于没有使⽤-f指令,所以默认使⽤上下⽂路径下名为Dockerfile的⽂件认为是构建镜像的“Dockerfile”。最后指定上下⽂路径,在这条命令中,上下⽂路径是.。
如果你学过Linux,你应该⾮常清楚上述命令中的⼩数点.代表的意思。在Linux中,⼩数点.代表着当前⽬录。所以docker build -t myimage .中⼩数点.其实就是将当前⽬录设置为上下⽂路径。
git常用指令执⾏docker build后,会⾸先将上下⽂⽬录的所有⽂件都打包,然后传给Docker daemon,这样Docker daemon收到这个上下⽂包后,展开就会获得构建镜像所需的⼀切⽂件。
如下所⽰,在执⾏完docker build后,会⾸先sending build context to Deckor daemon,也就是将上下⽂⽬录下所有⽂件打包发给Docker daemon。所以在使⽤Dockerfile⽂件时构建镜像时,⼀般将它放在⼀个空⽂件夹下,就是为了防⽌将其他多余的⽂件传出去。然后依次执
⾏Dockerfile的指令,如果指令正确执⾏,则继续执⾏下⼀条,直到所有指令执⾏正确完毕,镜像构建完成;如果指令执⾏出错,终⽌镜像构建。
[root@localhost newdir]# docker build -t myimage .
Sending build context to Docker daemon 2.048 kB
Step 1/2 : FROM ubuntu
---> 14f60031763d
Step 2/2 : RUN mkdir dir1
---> Running in c5117d908931
---> cb0193727724
Removing intermediate container c5117d908931
Successfully built cb0193727724
除了从本地构建以外,docker build还⽀持从URL构建,⽐如可以直接从Git repo中构建,这⾥也不展开介绍了,可以查看:
COPY指令和ADD指令
COPY复制⽂件;格式:COPY<;源路径> <⽬标路径>;
COPY指令编译到⽬录中的<;源路径>的⽂件或⽬录复制到新的⼀层的内部的<⽬标路径>位置。<;源路径>所指定的源必须在多个中,即必须是⼀部分根⽬录的相对路径!<⽬标路径>可以是容器内部的绝对路径,也可以是相对于⼯作⽬录的相对路径(⼯作⽬录可以⽤WORKDIR指令来指定,后⾯介绍)。⽬标路径不需要预先创建,如果⽬录不存在会在复制⽂件前先⾏创建⽬录。
ADD更⾼级的⽂件复制;格式:ADD<;源路径> <⽬标路径>;
ADD与COPY指令在功能上⼗分相似,但是在COPY的基础上增加了⼀些功能。例如,源路径可以是⼀个指向⼀个⽹络⽂件的URL,这种情况下,Docker引擎会试图下载这个URL指向的⽂件到<⽬标路径>去。
此外,当<;源路径>为⼀个tar压缩⽂件时,该压缩⽂件在被复制到容器中时会被解压提取。但是使⽤COPY指令将将tar压缩⽂件复制到<⽬标路径>中。如下图所⽰:
[root@localhost tempdir]# docker build -t myimage .
Sending build context to Docker daemon 12.8 kB
Step 1/2 : FROM ubuntu
---> 14f60031763d
Step 2/2 : COPY ./ar /dir1/
---> 070559867e22
Removing intermediate container 1e55f9f19333
Successfully built 070559867e22
[root@localhost tempdir]# docker run myimage ls /dir1/
⽽ADD指令如果<;源路径>为⼀个tar压缩⽂件的话,ADD指令将会⾃动解压缩这个压缩⽂件到<⽬标路径>去。如下所⽰:
[root@localhost tempdir]# docker build -t myimage .
Sending build context to Docker daemon 12.8 kB
Step 1/2 : FROM ubuntu
---> 14f60031763d
Step 2/2 : ADD ./ar /dir1/
---> ead6431f75ba
Removing intermediate container f5fdcd97e196
Successfully built ead6431f75ba
[root@localhost tempdir]# docker run myimage ls /dir1/
<
这样,如果你只需要tar包中的⽂件内容⽽不需要tar包,不要先COPY ./ar.gz,然后RUN tar –ar.gz && rm
因为,这些的每⼀层重建完就不会再发⽣改变,后⼀层上的任何改变只发⽣在⾃⼰这⼀层。诸如此类,删除前⼀层⽂件的操作,实际不是真的删除前⼀层的⽂件,,⽽是仅在当前层标记为该⽂件已删除。在最终容器运⾏的时候,虽然不会看到这个⽂件,但实际上该⽂件会⼀直跟随。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论