自己写 dockerfile,编译某个软件,编译的过程中 apt-get 装了一大堆依赖,下载了大量东西。
编译完成后我就用 apt-get autoremove 把所有不必要的依赖全删了。
镜像生成后用docker images
查看,有 1.8G。然后用该镜像生成容器,进入容器内部,用du -sh /
查看,其实才 300 多 M。
所以其实那些依赖确实已经删除了,但镜像文件依旧很大,可能是 docker 镜像某一层里这些编译过程还是没有删。
如此说来,那我 autoremove 不就没有必要了么?为什么我看官方几乎所有的镜像,编译的时候还是会 autoremove ?这种没必要的编译过程仍然被记录下来,会不会挤爆 dockerhub ……
而且我发现,docker 官方的一些镜像,虽然也都是手工编译的,但其大小好像也都不大啊,一般就 100MB,比如 httpd 压缩以后才 60 多 M,这是怎么做到的。。。
如果我想把自己编译的镜像全部保存到本地(用 docker save ),如何才能尽量减小他们的体积?
1
phithon OP 删除依赖用的是 apt-get purge -y --auto-remove ...
|
2
evlos 2017-05-12 03:57:45 +08:00 via iPhone
Remove 和安装命令写到同一行试试
|
3
ryd994 2017-05-12 06:28:20 +08:00 via Android 1
1. alpine apk virtual 很好用
2. 一次 RUN 就是一层,层与层之间删文件不减大小 3. 自己编译的话试试 squash 4. docker hub 的话试试 multi-stage build |
4
cyr1l 2017-05-12 06:28:38 +08:00 via iPhone 1
楼上说的对,RUN 命令要尽量写在一条里,每次 RUN 命令都是在之前的镜像上封装,只会增大不会减小
除此之外,可以选择比较小的基础镜像,比如 alpine , 一个 包含 nginx 的 alpine 镜像才十几兆. |
5
gamexg 2017-05-12 07:26:24 +08:00 via Android 4
Docker 重要更新: 原生支持多阶段构建(multi-stage build)
https://juejin.im/post/58f093b2a22b9d006ce69587 |
6
paranoiagu 2017-05-12 08:03:01 +08:00 via Android
apt 安装,编译,remove 要一气呵成。
|
7
neighbads 2017-05-12 08:33:35 +08:00
RUN 在一行写完。。。。
|
8
tinyproxy 2017-05-12 08:40:10 +08:00 via iPhone 1
才 1.8g。。。你看看隔壁巨硬的 iis,6 个 g 看的我怀疑人生
|
9
Eleutherios 2017-05-12 08:57:48 +08:00 1
…… 写在一层里啊
RUN apt-get install ** &&\ 你的代码 &&\ apt-get autoremove ** &&\ apt-get clean all && rm -fr ** |
10
mritd 2017-05-12 09:49:53 +08:00 via iPhone
三楼回答的已经很好了,你可以再参考一下 nginx-alpine 的 dockefile,应该很有参考价值
|
11
Muninn 2017-05-12 10:03:42 +08:00 1
直接的回答就是 docker 镜像是 git 的机制,安装和移除必须写在一行。 参考各大项目的 Dockerfile 就能看明白。
但是更好的做法是 5 楼贴的我的文章,用两段构建,绝对纯净。 只要你的 docker 升级到了 5 月的最新版。 |
12
cloverstd 2017-05-12 10:48:57 +08:00 1
|
13
l142857 2017-05-12 11:57:06 +08:00
@Muninn 提到的两段构建的玩法,一年前我们在自己开发的镜像制作管理工具中实现过: https://github.com/CtripCloud/docker-make#two-images-one-for-compile-one-for-deployment
|
14
ETiV 2017-05-12 12:49:54 +08:00 via iPhone
你要是懒得折腾 就 docker export 成打包文件
export 的不包含层信息,只有最后的文件系统 然后再 docker import 就行了 |
15
phithon OP @Muninn
知道了,安装和移除写在一行,可以减小大小。 不过官方的一些 dockerfile 并没有写在一起呀,比如 php 的 https://github.com/docker-library/php/blob/6844e717a56a5dd8ad87a236a96bea069cc635fd/7.1/apache/Dockerfile httpd 的 https://github.com/docker-library/httpd/blob/e885c0d63078153dc89fa0212314e590fec7fc93/2.4/Dockerfile apt-get install 和 apt-get purge 是在不同的 RUN 里…… |