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是基于原有镜像基础上构建的镜像,使用此方法构建镜像的目的:保存镜像里的一些配置信 ...
随机推荐
- SQL2012 尝试读取或写入受保护的内存。这通常指示其它内存已损坏
今天打开SQL2012,突然就连接不了数据库.一開始还以为是某个server崩溃了.结果试了好几个.都还是如此,弹出提演示样例如以下: 尝试读取或写入受保护的内存.这通常仅仅是其它内存已损坏.(Sys ...
- 2016/05/25 Ajax 跨域 转
起因: 起因是这样的,为了复用,减少重复开发,单独开发了一个用户权限管理系统,共其他系统获取认证与授权信息,暂且称之为A系统:调用A系统以B为例.在B系统 中用ajax调用A系统系统的接口(数据格式为 ...
- 2016/05/16 thinkphp3.2.2 验证码使用
Think\Verify类可以支持验证码的生成和验证功能. 生成验证码 下面是最简单的方式生成验证码: $Verify =new \Think\Verify(); $Verify->entry( ...
- java8--NIO(java疯狂讲义3复习笔记)
NIO采用内存映射文件的方式处理输入输出,NIO将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样来访问文件了(这种方式模拟了操作系统上的虚拟内存的概念),通过这种方式来进行输入输出比传统的 ...
- SVN服务器端的使用
SVN服务器端的使用 1.下载VirtualSVN Server,安装好后打开,右键Repository->新建->Repository创意一个版本库.默认点击下一步,输入要创建版本库的名 ...
- Java中使用HttpRequest获取用户真实IP地址端口
import javax.servlet.http.HttpServletRequest; /** * 自定义访问对象工具类 * * 获取对象的IP地址等信息 * @author X-rapido * ...
- Ubuntu上配置Eclipse:安装CDT【转】
本文转载自:http://www.linuxdiyf.com/linux/23519.html 在最新的 Ubuntu Kylin 16.04 中安装了eclipse,在纠结了很久的网络问题之后,开始 ...
- Ubuntu redmine 安装
/******************************************************************** * Ubuntu redmine 安装 * 说明: * 随着 ...
- [Codeforces 507E] Breaking Good
[题目链接] https://codeforces.com/contest/507/problem/E [算法] 首先BFS求出1到其余点的最短路 , N到其余点的最短路,记为distA[]和dist ...
- AutoIT: 如何设置GUICtrlCreateCombo选项为不可修改状态
GUICtrlCreateCombo中选中的选项是可修改的,也可设置为不可修改状态. #include<ComboConstants.au3> GUICtrlCreateLabel(, , ...