龙空技术网

小裁缝Docker系列(四):如何构建镜像

以码为梯 282

前言:

现在同学们对“构建镜像的方法”都比较着重,小伙伴们都需要了解一些“构建镜像的方法”的相关资讯。那么小编也在网摘上汇集了一些对于“构建镜像的方法””的相关知识,希望朋友们能喜欢,看官们一起来学习一下吧!

在《力荐!小裁缝Docker系列(三):如何让镜像“run”起来》这篇文章中,主要介绍了要如何通过镜像启动一个容器,我们用了topline/xiaocaifeng/spring-boot-mongo这个镜像,这个镜像是小编通过docker run命令构建出来的,这篇文章我们将介绍如何构建镜像。

我们先主要讲解下,构建镜像所需的Dockerfile文件,最后我们通过一个例子来讲解如何构建镜像。

Docker可以根据Dockerfile中定义的各个指令来构建镜像,因此我们这篇文章将着重讲解Dockerfile中常用的指令。

我们先看下小编构建之前镜像所写的Dockerfile:

从上图可以看出,在Dockerfile中指令规范为大写,参数为小写,#一般情况下用来注释,{}用来引用变量,对Dockerfile有了大概的了解之后,我们再分析这些指令。

FROM

选择一个基础镜像作为新的镜像的基础,后续的指令也在这个镜像之上。通常情况下,一个格式正确的Dockerfile应该是以FROM指令开始的。如果设置的镜像本地没有,docker会自动去下载。

MAINTAINER

用来描述构建这个镜像的作者或者团队,但是对于这样的信息使用LABEL指令更加的适合。

LABEL

LABEL指令用于给镜像加上元数据,其语法为:

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

一个镜像可以有一个或多个LABEL,但是因为一个LABEL会产生一个层,如果太多会对镜像本身产生影响,因此建议使用一个LABEL

LABEL multi.label1="value1" multi.label2="value2" other="value3"

可以通过 docker inspect “imageID”来查看标签。

ARG

ARG <name>[=<default value>]

ARG指令定义了一个变量(可以设置默认值,如果build命令没有传递则取默认值),用户可以在docker build命令中通过 --bulid-args<varname>=<value>进行传递。如果传递的参数名在Dockerfile中没有设置会出现警告。因为构建时变量可以通过docker history命令查看到,因此对于密码之类的敏感信息不建议通过ARG指令传递。另外只有定义在ARG后面的指令才可以通过${arg}获取到值。

另外,Docker也提供了一些预置的ARG,HTTP_PROXY,HTTPS_PROXY,FTP_PROXY,NO_PROXY.

ENV

ENV <key> <value> // 设置一个环境变量

跟ALBEL类似,建议只使用一个ENV指令,因为每个ENV指令都会产生一个曾(layer)。

在Dockerfile中使用ENV指令定义的变量可以使用${...},ENV变量可以设置默认值,如果想替换则在docker run 启动容器时,使用-e 设定(在前一篇Docker第三篇文章中有提到)。

ADD

ADD <src>... <dest> <src>表示将要拷贝的文件(夹)的路径(URL) <dest>表示镜像内部的路径

ADD ["<src>",... "<dest>"] 在路径中包含空格时必须使用这种语法

ADD指令拷贝文件,文件夹或者远程文件并将他们添加到镜像内部的目录

对于<src>是文件(夹)路径,必须相对于build的上下文,(可以理解为相对于Dockerfile目录)

对于"[","]"这样的特殊字符,需要进行转义,格式为[[]]

当<src>为目录时,将只拷贝目录下的内容

当<src>为一个真正意义上的压缩文件(而不是只是名字为压缩文件格式)时,将自动解压文件

<dest>是一个绝对路径,如果目标路径不是以"/"开头,它将文件拷贝到‘WORKDIR’/destdir/

如果<dest>指定的目录不存在,docker会自动创建缺失的目录

COPY

这个指令跟ADD差不多,可以参照COPY指令

WORKDIR

WORKDIR /path/to/workdir

WORKDIR指令设置工作目录,其他的指令(RUN ,CMD,ENTRYPOINT,COPY以及ADD)都在这个工作目录中工作。如果指令指定的目录不存在,docker会自动创建。

WORKDIR在Dockerfile中可以使用多次,如果第一个指令使用了相对路径,那么接下来的指令指定的目录都是相对于它。

WORKDIR /a

WORK b

WORK C

RUN pwd

结果将输出:/a/b/c

在WORKDIR指令中也可以使用

ENV DIRPATH /path

WORKDIR $DIRPATH

CMD

CMD指令有三种形式

CMD ["executable",‘param1“,"param2"]

CMD["param1","param2"]

CMD command param1 param2 // shell脚本格式,上面示例中也用的这种格式

一个Dockerfile中只可以出现一个指令,如果出现多个只有最后一个会起作用。CMD的目的是为执行容器设置默认值。

RUN

RUN指令的格式

RUN <command>

RUN [”executable“,"params1","params2"]

RUN指令将在当前镜像之上的层中执行并且提交执行结果,在接下来的构建过程中可以使用该结果。

示例

dockerfile

执行结果

通过docker images查询

到这里如何通过Dockerfile构建镜像就结束了,主要还是要熟悉理解每个指令的含义,谢谢大家的阅读,有什么建议希望可以在留言评论。

标签: #构建镜像的方法