14|容器化:如何将镜像体积缩减 90%?
王炜
你好,我是王炜。今天是我们容器化实践的第二课。
容器化的学习曲线是非常陡峭的,对于初学 Docker 的同学来说,短时间内很难针对已有业务编写合适的 Dockerfile。所以上节课,我直接给出了不同语言接近生产可用的 Dockerfile,但我并没有深入介绍里面涉及的一些构建技巧。
在这些案例中,我用到最多的就是通过“多阶段”的方式来构建镜像,但是对于“多阶段构建”,我们只知道了它的具体用法,并没有解释为什么要使用它。
在一般情况下,只知道“多阶段构建”的用法也是可以的。不过在现实生产过程中,我们可能面临一系列问题,例如,由于对镜像构建过程不够熟悉,很容易出现构建慢、构建镜像过大等问题,这会导致推送镜像变得缓慢,同时也会导致在 Kubernetes 更新应用镜像版本时拉取镜像的过程也变得缓慢,从而影响整体应用发布效率。所以,如何进一步借助多阶段构建来优化镜像大小就显得非常重要了。
这节课,我将带你深入了解“多阶段构建”,通过具体的实践,进一步理解它的最重要特性之一:减小镜像体积。在缩减镜像的实战过程中,我还会为你解释在上一节课用到的其他构建技巧。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文通过实际操作和技术讲解,向读者介绍了如何通过多阶段构建来缩减容器镜像体积,并优化镜像大小的方法和技巧。作者以构建Golang镜像为例,展示了减小镜像体积的具体方法,包括更换基础镜像和多阶段构建。文章强调了多阶段构建的重要性,以及如何利用这一技术特点来优化镜像大小,提高应用发布效率。此外,还介绍了如何进一步压缩镜像大小,使用Alpine镜像作为第二阶段的运行镜像,以及如何复用构建缓存以加速镜像构建过程。总之,本文为读者提供了优化容器镜像大小的有效方法和技巧,对于需要深入了解镜像优化的技术人员具有重要参考价值。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云原生架构与 GitOps 实战》,新⼈⾸单¥59
《云原生架构与 GitOps 实战》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(9)
- 最新
- 精选
- includestdio.h1.不加[]代表用 /bin/sh 执行 /opt/app/example ,由于 scratch 是空镜像,所以会报错:exec: "/bin/sh": stat /bin/sh: no such file or directory: unknown.(加[]代表为 ENTRYPOINT 提供参数) 2.去掉 CGO_ENABLED=0 启动容器后会提示:exec user process caused: no such file or directory,alpine 更换 ubuntu 后运行正常。原因:因为 alpine 镜像中没有 glibc ,不禁用 CGO 的话编译会失败,不会产生二进制文件,所以最终CMD ["/opt/app/example"] 会报错:no such file or directory(而 ubuntu 本身包含 glibc ,不禁用 CGO 编译也是正常的)
作者回复: 👍🏻非常正确!
2023-01-09归属地:广东215 - 争光 AlanAlpine 能压缩大小,但也会引入很多问题 1. 新的操作系统的安全补丁维护 2. bug,比如glibc的导致的很多问题 这一块再具体落地的时候怎么抉择呢?
作者回复: 是的,Alpine 的c 语言库差异会导致很多奇怪的问题。 生产实践上还是推荐用标准的 Linux 发行版镜像,比如 ubuntu,debian 之类的,此外,slim 版本的镜像在大部分场景已经很小了,没必要追求极限的镜像大小。
2023-01-10归属地:广东1 - 农民园丁请问老师,spring-boot的构建方法环能优化吗?之前的占了284MB。
作者回复: 可以的,下一节课的内容有提到。
2023-01-09归属地:广东1 - jeffery问题1 更改后 image 可以正常构建 但run报错 docker: Error response from daemon: failed to create shim: OCI runtime create failed: runc create failed: unable to start container process: exec: "/bin/sh": stat /bin/sh: no such file or directory: unknown. ERRO[0000] error waiting for container: context canceled 问题2 删除CGO_ENABLED=0 后启动 docker run --publish 8080:8080 delete exec /opt/app/example: no such file or directory 镜像构建后大小 delete latest d968f205c52d 8 minutes ago 13.9MB delete1 latest cb6a0e65cda9 34 minutes ago 84.7MB Alpine 不带常规debug 命令
作者回复: 👍🏻可以继续深入调查一下第一个问题为什么两种写法会有差异。
2023-01-09归属地:广东31 - Kyle这一期听得相当爽,可以说是极致的体积优化了
作者回复: 感谢对课程的认可!
2023-04-20归属地:湖北 - 0ck0比较关心 python 业务的镜像如何优化
作者回复: 下一讲里有提到,主要是选择合适的基础镜像。
2023-01-11归属地:北京 - 哈德韦如果是 JAVA 应用,如果利用构建缓存呢?另外先 COPY 依赖,会不会导致宿主机的依赖文件不适配 Docker 里的依赖呀?2023-11-07归属地:浙江
- 哈德韦Dockerfile 开头的 # syntax=docker/dockerfile:1 是什么意思?是用来指示语法高亮的,还是类似 Shebang 的?2023-11-07归属地:浙江
- 橙汁我艹 scrtch是什么,竟然还有这种镜像 学到了,目前项目用啥镜像的都有 debian alpine ubuntu 真是乱七八糟的,镜像就是还缺点基础工具 比如ping ip 等这些不同底包里面的基础包也不同,安装后镜像其实也挺大,还比较期待周三 alpine的glibc和m什么的之前就一直没懂2023-01-09归属地:北京
收起评论