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是基于原有镜像基础上构建的镜像,使用此方法构建镜像的目的:保存镜像里的一些配置信 ...
随机推荐
- Android ViewPager实现Tabhost选项卡底部滑块动态滑动过渡
<Android ViewPager实现Tabhost选项卡底部滑块动态滑动过渡> 之前基于github上的第三方开源控件ViewPagerIndicator的UnderlinePa ...
- Hive中行列转换
1.演示多列转为单行 数据文件及内容: student.txt xiaoming|english|92.0 xiaoming|chinese|98.0 xiaoming|math|89.5 huahu ...
- 【转】Selenium2学习路线
课程大纲:第一部分:基础入门 第一课: SELENIUM2的原理介绍及环境搭建本节课主要讲解SELENIUM2的原理,让大家了解SELENIUM2的发展历程,同时解惑大家对自动化测试中产生的一些误区. ...
- Redis实践系列丨Codis数据迁移原理与优化
Codis介绍 Codis 是一种Redis集群的实现方案,与Redis社区的Redis cluster类似,基于slot的分片机制构建一个更大的Redis节点集群,对于连接到codis的Redis客 ...
- CSVReader
从网上找了一个开源的东东 ,网址 https://www.csvreader.com/
- iOS开发——高级篇——FMDB 数据库简单使用
#import <Foundation/Foundation.h> @interface UserDB : NSObject // 把userDB设计成一个单例类 + (id)shareI ...
- Hackrank Kingdom Division 树形DP
题目链接:传送门 题意: 给你一棵树,n个点 每个点可以染成红色和蓝色 但是红色的点与其相邻的点中必须有红色节点,蓝色也是 问你有多少种染色的方案 题解: 树形dp 先转化为有根树,取1为根 设定dp ...
- 不同节点 IP 时间同步 分布式时间同步系统的参考时间获取技术分析
linux linux下时间同步的两种方法分享_LINUX_操作系统_脚本之家 http://www.jb51.net/LINUXjishu/73979.html 分布式时间同步系统的参考时间获取技术 ...
- 识别jar的编译JDK版本
解压jar,获取xxx.calss文件 dos命令行javap -verbose classname import java.io.InputStream; import java.io.PrintW ...
- POJ - 2516 Minimum Cost(最小费用最大流)
1.K种物品,M个供应商,N个收购商.每种物品从一个供应商运送到一个收购商有一个单位运费.每个收购商都需要K种物品中的若干.求满足所有收购商需求的前提下的最小运费. 2.K种物品拆开来,分别对每种物品 ...