在官方提供的镜像中,大部分都是基础镜像,他们只提供某个简单的功能,如果想要一个功能更加丰富的镜像,就需要自己制作。
比如说一个容器配置完毕后,想要让容器便于传输,就可以封装为一个镜像。或者说希望让自己的容器可以被别人看到,提交到仓库上去,也要先变为镜像。
在指令中,可以使用快照的形式快速制作一个镜像,它直接将一个容器导出为镜像。除此之外,还提供了另一种方式构建镜像:编写。
是一个文件,首字母大小写任意,依据这个文件,就可以构建出一个镜像。在联网的状态下,只要有这个文件,就可以构建出任意的镜像。
docker build
命令可以读取文件,并依据文件构建镜像。
语法:
参数:
- :指定要使用的路径,默认为当前目录下的文件
- :指定镜像的名称与标签
具体使用,在稍后编写时一起讲解。
是一个文本文件,内部包含多条指令,这些指令描述了如何构建一个镜像,如果构建的镜像不符合要求,还可以修改反复制作镜像。
的不区分大小写,后续的指令都以大写形式。
使用进行注释:
FROM
- :指定一个基础镜像
语法:
指定镜像时,可以使用对这个镜像重命名,这样可以在一个中进行多级构建,这个稍后会讲解。
示例:
使用指定基础镜像时,如果基础镜像不存在,那么会自动拉取。
COPY
- :从宿主机或者其它镜像中拷贝文件
语法:
将文件从拷贝到,如果有多个文件,使用逗号分隔。如果在文件名中没有出现空格,可以不用双引号,如果文件名内有空格,就需要使用和。
选项:
- :修改用户和组
- :可以从之前的镜像中拷贝文件
拷贝宿主机文件:
以上代码指定了一个的基础镜像,并拷贝一个宿主机文件到根目录下。
通过构建镜像:

选项指定镜像名为,随后开始执行内部的指令,可以看到,这就是之前写的指令。
实例化一个容器:

进入容器后,根目录就多出了文件,这是构建镜像时拷贝进去的。
除此之外,还可以进行多级构建,所谓的多级构建,就是可能最终镜像内部的文件来自不同环境。那么先在某些镜像环境内部生成所需的文件,再把文件拷贝到最终的镜像内。
示例:
以上代码,先创建了一个镜像,重命名为,随后创建一个镜像,在镜像中,拷贝来自的内容,把目录下的文件拷贝到自己的根目录。
多级构建时,最终的镜像是最后一个指定的镜像,前面指定的镜像都是为了生成某些文件。
构建镜像:

最终生成一个镜像。
进入镜像:

进入后,根目录多出了,输出后得到一个的网页文件,这个文件就是在镜像生成的,最后拷贝到了中。
ENV
- :设置环境变量
语法:
环境变量不仅可以在容器内部使用,还可以在后文通过引用。
示例:
定义了一个环境变量,后续可以直接通过取出变量值。
WORKDIR
- :修改工作目录
语法:
在构建镜像时,默认的工作目录都是根目录,如果想要切换目录,可以使用。
示例:
以上代码,把宿主机的文件拷贝到容器的目录下。
因为修改了,所以就是。
ADD
- :将文件添加到镜像中,可以解压缩tar压缩文件
语法:
选项:
- :修改文件所有者和组
此处的非常类似,用法也是一致的,功能都是拷贝文件。
但是比更强大,如果是压缩包,那么会自动完成解压缩。如果是一个,还会完成自动下载。
示例:
将文件,通过命令,添加到镜像的根目录中。
输出结果:

创建完镜像再启动后,根目录下的内容不是而是,说明文件被自动解压了。
RUN
- :在构建镜像的过程中执行命令
语法:
在构建镜像的过程中,可以通过执行指定命令,两种语法中,他们的效果其实是不一样的。
直接,会以来执行指令,这可以提供一些的特性,比如可以使用通配符等进行替换,以及运行程序等。
但是使用的形式执行命令,不会具有特性。
示例:
以上代码,把宿主机的拷贝到镜像的根目录,这是一个通配符,可以拷贝多个文件。
随后通过执行命令,创建了两个目录。最后把从宿主机拷贝来的文件再拷贝到目录里面,分别使用和两种语法。
输出结果:

在当前目录下,有、、、四个文件,构建镜像时,可以看到执行成功了,但是失败了。
因为不支持特性,导致无法匹配通配符,最后显示找不到这个文件。
CMD
- :指定容器启动时执行的命令
语法:
其中和的两种形式,和之前的一样,重点在于是否具有
特性。
示例:
这个镜像,在启动时会执行内的命令,输出字符串。

原先的是,也就是进入命令行,由于输出字符串的命令将其覆盖了,所以无法直接进入命令行。
除此之外,的命令还会进行覆盖,比如内部的多个,后面的会覆盖前面的:
最后该镜像的命令是,前两个被覆盖了。
除此之外,在启动容器时用户也可以指定命令,这个命令也可以覆盖:

ENTRYPOINT
- :指定容器启动时执行的命令
语法:
和的功能是一样的,但是语法特性略有差别。
在中,后面的会覆盖前面的,启动容器时的命令也会覆盖。
在中,一个只有最后一个生效,但是用户输入命令时,会变成的参数,而不是覆盖。
示例:

构建成功后,在启动容器时指定命令,输出结果却不是,而是:
这是因为后面的都变成了内部的指令的参数,最后相当于执行:
USER
- :指定运行容器时的用户或用户ID
语法:
默认情况下用户为,可以通过命令修改后文执行指令时的用户。
示例:
以上代码,通过创建了一个用户,并切换用户为。
输出结果:

创建容器后,默认用户就是,并且处于该用户的家目录中。
ARG
- 功能:定义构建时的变量
语法:
这个用于指定一些参数,这个参数可以在中通过引用。
示例:
将刚才的用户家目录定义在参数中,后续可以直接通过引用。
VOLUME
- 功能:创建一个匿名卷,并指定挂载点
语法:
由于镜像实例化时,用户所处的路径是不确定的,就算确定了路径,也不保证用户存在这个路径,所以在镜像构建阶段不能创建绑定卷,只能创建匿名卷。
在的参数中,指定的就是要进行绑定的匿名卷,可以持久化一些重要数据,就算容器崩溃,用户也有机会找回数据。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/45658.html