dockerfile构建的镜像
转载请注明出处 https://www.cnblogs.com/majianming/p/9536975.html
在每执行一个命令时,便会commit形成一个层,最后形成堆栈式的结构。最后的镜像是各个分层按照顺序堆叠起来的结果。

其中镜像层的内容并不能被之后的命令修改,也就是一个层的文件都是只读的,如果需要修改文件,那么只是在顶端添加一层,然后在最上一层添加修改之后的文件,并对上层屏蔽修改之前的文件,修改之前的文件仍然原样存在原本的层中。
比如接下来的场景,使用了wget下载了nginx并解压(忽略编译等步骤),然后删除
RUN wget --no-check-certificate -O /tmp/nginx-1.15.2.tar.gz http://nginx.org/download/nginx-1.15.2.tar.gz
RUN cd /tmp/ && tar zxf nginx-1.15.2.tar.gz
RUN rm nginx-1.15.2.tar.gz
原本看起来没有什么不正确,先看nginx-1.10.2.tar.gz,解压后的压缩文件应该删除是没有错的,但是按照上面说的,这样的删除实际上是没有用的,只是层镜像屏蔽了对这个文件的可见性而已,这个文件还是存在于上层镜像,所以最后的镜像大小并不会因为执行了这个命令而减少。
(D 表示delete,删除; A表示add,添加;C表示change,修改)
上图也说明了一点,如果尝试删除镜像中已经存在的文件,因为文件实际上并没有被删除,只是被屏蔽致使上层不可见,所以并不会减少镜像的大小(还可能增大,什么时候会可能增大?因为删除过程中还可能修改了其他文件,那么这些被修改的文件需要复制一份到顶层,然后修改,而原来的镜像文件并没有变化)
那么反正没有用,我们不删除?
这个也是不对的,在构建过程中,要随手删除产生的额外文件,这里并没有和上面所说的矛盾,准确来说是在同一个命令中删除无用的文件。那么上面的命令应该改为
RUN wget –no-check-certificate -O /tmp/nginx-1.10.2.tar.gz http://nginx.org/download/nginx-1.10.2.tar.gz && cd /tmp/ && tar zxf nginx-1.10.2.tar.gz && rm nginx-1.10.2.tar.gz
这样这个命令执行完毕时,commit形成的新的镜像也就不会存在nginx-1.10.2.tar.gz,同理,在nginx编译过程中会产生许多的中间文件,为了保证最后的镜像的最小,也需要在同一个命令中删除文件。
上面提到了对于dockerfile的每一个命令都会自动commit形成,如果使用aufs文件系统,会受到42层的限制,所以按照这个理论应该减少层的形成,但是应该与以下情况相权衡
如果是在docker镜像中编译java文件,那么常常会出现以下的情况
# 拷贝文件
COPY . /opt/`
# 执行构建
RUN mvn clean package
这样的话,在执行构建的情况下,会依照pom文件下载相应的依赖库,但是在很多情况下这些依赖库是不会改变的,所以可以缓存起来,所以可以先复制pom文件,然后下载相应的依赖,再复制容易改变的源代码等文件后进行构建,充分利用缓存
COPY pom.xml /opt/
RUN mvn verify clean --fail-never -f /opt/pom.xml
COPY src/ /opt/src
RUN mvn clean package
参考
AUFS https://coolshell.cn/articles/17061.html
aufs wiki https://zh.wikipedia.org/wiki/Aufs
docker 存储驱动 https://docs.docker.com/storage/storagedriver/select-storage-driver/#supported-storage-drivers-per-linux-distribution
docker 实战(docker in action中文版)
aufs文件系统的42层限制 https://stackoverflow.com/questions/39382518/whats-the-reason-for-the-42-layer-limit-in-docker
联合文件系统 https://yeasy.gitbooks.io/docker_practice/underly/ufs.html
转载请注明出处 https://www.cnblogs.com/majianming/p/9536975.html
dockerfile构建的镜像的更多相关文章
- 使用dockerfile构建nginx镜像
使用dockerfile构建nginx镜像 docker构建镜像的方法: commit.dockerfile 1.使用commit来构建镜像: commit是基于原有镜像基础上构建的镜像,使用此方 ...
- Dockerfile构建私有镜像
构建第一个镜像 镜像的定制实际上就是定制每一层所添加的配置,文件.我们可以把每一层修改,安装,构建,操作的命令都写入一个脚本,这个脚本就是Dockerfile.Dockerfile是一个文本文件,其内 ...
- Dockerfile构建jar镜像
dockerDockerfilejar包docker-compose 一.安装docker和compose 二.准备jar包 三.编写配置文件 1. Dockerfile 2. docker-comp ...
- Dockerfile构建nginx镜像
Dockerfile构建nginx镜像 [root@bogon ~]# mkdir /opt/docker-file [root@bogon ~]# cd /opt/docker-file/ [roo ...
- Docker学习(六)Dockerfile构建自定义镜像
Docker学习(六)Dockerfile构建自定义镜像 前言 通过前面一篇文章可以知道怎么去使用一个镜像搭建服务,但是,如何构造自己的一个镜像呢,docker提供了dockerfile可以让我们自己 ...
- dockerfile构建Tomcat镜像
dockerfile构建Tomcat镜像 一.镜像分层概念 二.制作tomcat镜像 2.1.创建分层目录 [root@node2 ~]# mkdir /app/{web/{nginx,tomcat, ...
- Docker 使用Dockerfile构建redis镜像
Dockerfile实现: FROM centos: MAINTAINER hongdada "hongdaqi159505@gmail.com" WORKDIR /home RU ...
- Docker 使用Dockerfile构建tomcat镜像
Dockerfile概念: 镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么之前提及的无法重复的问题. ...
- 如何使用Dockerfile构建Tomcat镜像并部署war
我们都知道Docker构建一个镜像有两种方式: 使用`docker commit`命令 使用`Dockerfile`文件和`docker build`命令 那么这两种方式有何区别呢? 相同点:底层实现 ...
- 使用dockerfile构建nginx镜像 转
docker构建镜像的方法: commit.dockerfile 1.使用commit来构建镜像: commit是基于原有镜像基础上构建的镜像,使用此方法构建镜像的目的:保存镜像里的一些配置信 ...
随机推荐
- eclipse下对中文乱码问题的一些思考
一.浏览器问题 当你的html页面或jsp页面没有显式声明页面编码的时候,也就是没有下面其中之一的代码 <meta http-equiv="content-type" con ...
- noteexpress使用指南
软件功能:在写论文时直接调用参考数据并输出正规的格式. (以下简称NE) A.下载安装 下载地址:Note-express - Bibliography Software 选择相应的学校进行下载,相 ...
- [10.27_P3] 简单题 (脑洞)
Description dzy 手上有一张n 个点m 条边的联通无向图,仙人掌是一张每条边最多在一个简单环内的联通无向图.他想求这个无向图的生成仙人掌中最多有多少条边. 但是dzy 觉得这个问题太简单 ...
- 并不对劲的noip2018
day1 road 题意 有n(\(n \leq 10^5\))个数\(a_1,a_2,...,a_n\)排成一排,每次可以选择一段大于零的数减一,问最少几次把所有数减为0. 题解 先想到一个简单的策 ...
- 计算属性computed 与methods
你可能已经注意到我们可以通过调用表达式中的 method 来达到同样的效果: <p>Reversed message: "{{ reversedMessage() }}" ...
- facebook chat api 使用
官方API文档: https://developers.facebook.com/docs/chat/ 下面是根据文档修改的类: <?php class Invite_Chat{ protect ...
- 06_传智播客iOS视频教程_源文件后缀名和main函数
OC与C语言的不同. 把OC程序运行起来,CPU只会找main函数.并且只会执行main函数当中的代码.当main函数的代码执行完毕之后这个程序就自动结束掉了. main函数的参数是可以让我们在运行程 ...
- ASP.NET验证控件CustomValidator客户端验证DropDownList、TextBox
<asp:DropDownList ID="ddlTown" runat="server"> <asp:ListItem Value=&quo ...
- python 面向对象二 类和实例
一.类和实例 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法, ...
- bzoj 1072: [SCOI2007]排列perm【状压dp】
先写了个next_permutation结果T了,于是开始写状压 设f[s][i]为选取状态为s,选的数模d为i的方案数,去重的话直接除以每个数字的出现次数的阶乘即可 #include<iost ...