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是基于原有镜像基础上构建的镜像,使用此方法构建镜像的目的:保存镜像里的一些配置信 ...
随机推荐
- B+树在NTFS文件系统中的应用
B+树在NTFS文件系统中的应用 flyfish 2015-7-6 卷(volume) NTFS的结构首先从卷開始. 卷相应于磁盘上的一个逻辑分区,当你将一个磁盘或者磁盘的一部分格式化成NTFS,卷将 ...
- I2C上拉电阻取值范围
I2C总线是微电子通信控制领域中常用的一种总线标准,具备接线少,控制简单,速率高等优点.在I2C电路中常见的上拉电阻有1k.1.5k.2.2k.4.7k.5.1k.10k等等,但是应该如何根据开发要求 ...
- VS类添加头文件注释
VS2015参考: http://blog.csdn.net/qq395537505/article/details/50853546 修改两个文件,详细信息 VS2010: 找到VS的安装目录 E ...
- ios app抓包分析
1 使用rvictl工具 这是mac下的一条命令.ios usb连mac,然后创建虚拟网络接口. 2 使用wireshark抓包 wireshark可以抓这个虚拟网络接口上的数据包.
- Tju 4119. HDFS
4119. HDFS Time Limit: 5.0 Seconds Memory Limit: 5000KTotal Runs: 225 Accepted Runs: 77 In HDF ...
- 【Linux 内核网络协议栈源码剖析】网络栈主要结构介绍(socket、sock、sk_buff,etc)
原文:http://blog.csdn.net/wenqian1991/article/details/46700177 通过前面的分析,可以发现,网络协议栈中的数据处理,都是基于各类结构体,所有有关 ...
- java web框架收集
一.前端框架: 1.vue.js 2.angular.js 二.后端框架: 1.struts2 2.springmwc 三.数据库映射框架: 1.hibernate 2.mybatis 四.数据库: ...
- [Usaco2018 Feb] New Barns
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=5192 [算法] 维护树的直径,在树上离一个点最远的点一定是一条直径的端点. ...
- bzoj 3481 DZY loves math —— 反演+Pollard_rho分解质因数
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3481 推式子:xy % P = Q 的个数 由于 0 <= x,y < P,所以 ...
- python编写猜拳代码
一.项目要求: 电脑随机出拳和用户猜拳三次.胜利条件如下: (1)(石头 胜 剪刀) (2)(剪刀 胜 布) (3)(布 胜 石头) 二.代码 #!/usr/bin/env python # -*- ...