| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> 【docker】大小仅3GB的Oracle21c的docker镜像,含apex和oml4py -> 正文阅读 |
|
[系统运维]【docker】大小仅3GB的Oracle21c的docker镜像,含apex和oml4py |
前言之前在【ORACLE】从安装ORACLE LINUX 8开始构建一个ORACLE21C的docker镜像这篇文章中,最后构建出来的docker镜像有15GB,上传阿里云压缩后也有9GB,我怎么算都不对劲,系统100M,数据库也就几个GB,加上APEX,怎么也应该也不会超过10GB,有没有办法把大小压一压呢? 问题分析于是我运行了一下
发现有些层的数据大小出现了重复,有个3GB大小的额外出现了2次,所以导致整个镜像很大。于是我又仔细看了下Tim Hook的dockefile,发现写得很整齐规范,根据执行内容的不同,把代码分成了很多个阶段,并标有注释。 但是,对于dockerfile来说,每执行一条指令,它就会构建一个新的层。如果某条指令有修改现有的文件,那么它就会把数据都复制出一个新的层,这样大小就翻倍了。就算在本层把无用大文件删掉,上一层的大小还是不会变,因为上一层还有这个大文件。 所以,有时候会发现,常见的dockerfile都是用"&&\"把代码合并成一条来执行的,但本次的dockerfile代码量有点多,全合成一行不方便查看和修改,所以此时就要引入多阶段构建的概念。 Docker Engine 17.05 中引入了多阶段构建语法。 关于这个多阶段构建,我看了不少国内的文章介绍,但是大部分都是复制了一次官方的例子,或者稍做修改,完全没有找到我想要的用法。绝大部分能搜到的例子都是使用前一阶段的构建作为后一阶段构建的部分文件,而我需要的是只保留最后一个指令执行后的数据,前面不管有多少层都不要了。 于是我开始在github上搜“dockerfile”,看别人是怎么写的,果然绝大多数都是把指令都用"&&\"合并成了一条,然后我继续找,直到看到zabix的一个dockerfile,瞬间得到了启发,
因为我搜到的其他例子大多都是这么写的
搜不到一例复制所有文件的,所以不清楚这个语法应该是 “/ /” 还是 “. .”,是复制文件夹还是复制文件夹中的所有文件?但是有了zabix的这个例子,它是使用了一个包含两个元素的list,前面和后面都是一个文件夹,且末尾没有"/",类型是一样的,那么理论上,它是支持同名文件夹直接覆盖的。 解决方案所以,我的想法是,无论一个dockerfile前面执行了多少条指令,我只要在最后,再执行一次构建,构建的源镜像和第一阶段的源镜像保持一致(理论上,空镜像也行?),然后把第一阶段最终构建的所有文件都复制到第二阶段构建中去,那么第二阶段的镜像就只有一层了,而且这种方法是通用的。 就像这样:
于是开始实测,首先我把第二次构建加在了CMD命令的后面,发现以这个镜像创建容器并启动后,它并不会执行CMD中的内容,于是我就把第二次构建向上移动一条,结果又发现,构建的环境变量不会被继承,于是我又把第一阶段声明的环境变量在第二阶段又复制粘贴了一次。最终果然成功了。
改之后结构为这个样子
可以看到并不用修改多少代码,即可把所有无用的层都干掉,每个文件只留一份数据。 成品按这个方案构建后,最终的镜像大小只有9GB了 然后上传阿里云 阿里云压缩后只有3G了 项目地址:https://github.com/Dark-Athena/dockerfile/tree/main/ol8_21_oml4py docker pull及run:
补充其实Tim Hook也说了,这是他用来玩的,有些地方写得不是很好,不过我倒是通过这次亲自尝试,对docker又多了一点经验,要是一开始他的dockerfile构建的镜像很小,我又怎么会想到要去优化它呢?
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/16 0:48:57- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |