肥胖图像的问题 我们都去过那里: 你拉出一个图像,跑, 看到一个1.2GB的怪物盯着你。
这不仅浪费了磁盘空间, 更慢的拉力, 更慢的部署, 以及更大的攻击表面。
通常的嫌疑犯吗?
以不必要的工具来建立基础图像,建立遗留下来的依赖,以及包含临时文件或缓存的地层.
我曾经犯罪过 运送的图像 可能是20x更小。
随着时间推移,我采用了一些能产生真正变化的技术.
这是实际可行的。
开始小: 选择右下方 您的基部图像设置了地层 。
大约78MB,但低于5MB。
如果你正在运行一个Go 二进制,你甚至不需要一个完整的OS:是字面上的空.
对于Python,考虑取而代之(包括编译器和标题,您在运行时可能不需要).
例如,简单的Python应用:这已经是完整图像大小的一小部分.
多步骤构建:游戏改变器 如果你需要制造工具,就不要运货 多相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相 这里有一个Go的例子: 最后的图像只是二进制.
对Go应用来说,一般是10到20MB.
对于一个Node.js app,你可以做同样的事情:在构建器中安装依赖性,然后复制和代码到一个微弱的运行时图像.
在同一层中清理 每一个命令都会创建一层.
如果您安装了软件包,然后在单独的 中将其删除,删除不会将数据从上层删除;它只是在上方添加了一个新的层.
大小犹存.
总是把清理结合起来, . dockerignore: 停止复制 Junk 如果您正在复制您的整个工程目录, 您可能包含, , 测试文件, 或本地缓存 。
最小值可以保存兆字节 : 这也加快了构建上下文的传输.
使用无线图像 如果您需要运行时间而非外壳,请考虑Google的不动图像.
它们只包含您的运行时间( 如 Python, Node) 和必要的库, 没有软件包管理器或 shell 。
这减少了攻击的地表和大小.
例如: 注:不能入出不动的容器(没有外壳),因此调试比较狡猾.
即取取舍相.
检查您的图层 建成后,检查你的形象,看看什么占用空间: 你会看到每层的大小加起来。
如果你看到一个巨大的层 你认为你清理的东西, 你知道你错过了结合命令。
另外,请显示总大小,但要分解您所有的图像、容器和缓存。
现实主义实例: Python API 相会相会.
一个FastAPI应用, 这避免了在最终图像中安装构建依赖.
如果你觉得舒服,你甚至可以无所适从。
最后想法 震动的影像不仅仅是美学 较小的图像拉得更快,开始得更快,脆弱性也更小.
这些技术是直截了当的:取出一个细小的基底,使用多相构件,同层清理,并忽略不必要的文件.
下次你造出一个形象,跑去问问你自己:我需要这些吗?
答案通常是否定的.