docker 镜像过大的问题

2017-05-12 03:37:21 +08:00
 phithon

自己写 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 ),如何才能尽量减小他们的体积?

13068 次点击
所在节点    Docker
16 条回复
phithon
2017-05-12 03:48:17 +08:00
删除依赖用的是 apt-get purge -y --auto-remove ...
evlos
2017-05-12 03:57:45 +08:00
Remove 和安装命令写到同一行试试
ryd994
2017-05-12 06:28:20 +08:00
1. alpine apk virtual 很好用
2. 一次 RUN 就是一层,层与层之间删文件不减大小
3. 自己编译的话试试 squash
4. docker hub 的话试试 multi-stage build
cyr1l
2017-05-12 06:28:38 +08:00
楼上说的对,RUN 命令要尽量写在一条里,每次 RUN 命令都是在之前的镜像上封装,只会增大不会减小

除此之外,可以选择比较小的基础镜像,比如 alpine , 一个 包含 nginx 的 alpine 镜像才十几兆.
gamexg
2017-05-12 07:26:24 +08:00
Docker 重要更新: 原生支持多阶段构建(multi-stage build)
https://juejin.im/post/58f093b2a22b9d006ce69587
paranoiagu
2017-05-12 08:03:01 +08:00
apt 安装,编译,remove 要一气呵成。
neighbads
2017-05-12 08:33:35 +08:00
RUN 在一行写完。。。。
tinyproxy
2017-05-12 08:40:10 +08:00
才 1.8g。。。你看看隔壁巨硬的 iis,6 个 g 看的我怀疑人生
Eleutherios
2017-05-12 08:57:48 +08:00
…… 写在一层里啊

RUN apt-get install ** &&\
你的代码 &&\
apt-get autoremove ** &&\
apt-get clean all && rm -fr **
mritd
2017-05-12 09:49:53 +08:00
三楼回答的已经很好了,你可以再参考一下 nginx-alpine 的 dockefile,应该很有参考价值
Muninn
2017-05-12 10:03:42 +08:00
直接的回答就是 docker 镜像是 git 的机制,安装和移除必须写在一行。 参考各大项目的 Dockerfile 就能看明白。

但是更好的做法是 5 楼贴的我的文章,用两段构建,绝对纯净。 只要你的 docker 升级到了 5 月的最新版。
cloverstd
2017-05-12 10:48:57 +08:00
l142857
2017-05-12 11:57:06 +08:00
@Muninn 提到的两段构建的玩法,一年前我们在自己开发的镜像制作管理工具中实现过: https://github.com/CtripCloud/docker-make#two-images-one-for-compile-one-for-deployment
ETiV
2017-05-12 12:49:54 +08:00
你要是懒得折腾 就 docker export 成打包文件

export 的不包含层信息,只有最后的文件系统

然后再 docker import 就行了
phithon
2017-05-12 15:18:26 +08:00
@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 里……
Muninn
2017-05-12 23:13:14 +08:00
@phithon 可能追求不一样 有的镜像是为了逻辑更清晰。

官方两段构建刚出来几天,还没有啥官方镜像用,只要你的 docker 是最新的就可以上手用了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/360759

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX