什么?打包docker镜像后只有4兆?极限压缩手段,了解一下。

595 阅读2分钟

最初go程序的大小是17MB

如何将golang程序的镜像压缩到4MB么?请看这里

首先我使用upx将它压缩到4MB

这是一个压缩二进制的工具。

具体命令:

GOOS=linux GOARCH=amd64 go build -ldflags "-a -s -w"  // 这里-ldflags去掉些符号。
upx -9 -k viot-worker  // -k是保留备份的意思,viot-worker是二进制文件的名称,替换成你们的就可以了。

如何将golang程序的镜像压缩到4MB么?请看这里

现在是4MB,但是还没有打包成镜像

然后我精心挑选一个镜像它叫iron/base,只有一个7MB的基础镜像。

如何将golang程序的镜像压缩到4MB么?请看这里

然后我通过以下Dockerfile将go程序打包成镜像。简化了些跟文章无关的内容。

FROM iron/base
WORKDIR /root
COPY viot-worker /root

RUN chmod +x viot-worker
ENTRYPOINT ["./viot-worker"]

打包镜像的命令

docker build -t demo/viot-worker:3 .

如何将golang程序的镜像压缩到4MB么?请看这里

这个时候整个镜像到了15MB

然后我出动了镜像压缩神器docker-slim。

执行了下面命令。

docker-slim build demo/viot-worker:3 --http-probe=false

如何将golang程序的镜像压缩到4MB么?请看这里

中途出现红色字体,点击回车就好。

生成了x.slim的镜像就是打包后的镜像,大小是4MB。

如何将golang程序的镜像压缩到4MB么?请看这里

这个时候整个镜像就已经被压缩到4MB

接下来我们试试可否运行

由于我是部署在私有云的k8s上的。因此修改这个镜像地址就可以测试是否运行了。

如何将golang程序的镜像压缩到4MB么?请看这里

容器重新部署后,容器日志显示已经启动成功!

如何将golang程序的镜像压缩到4MB么?请看这里

现在我们已经成功将go程序打包成一个4MB的镜像并运行起来,貌似还挺快的。

现在总结一下我们的技巧。

总结技巧

  1. 使用upx压缩二进制文件,这一步从17MB->4MB
  2. 使用iron/base镜像,让整体体积不至于太膨胀。这一步从4MB->15MB
  3. 使用docker-slim压缩镜像,这一步从15MB->4MB