go语言控制台编译体积 go语言编译工具

go和rust打包软件大小0.86MB 。go和rust打包软件大小是0.86MB,go和rust的软件包是属于整套的软件包,需要将go和rust软件包在windows的原文件里进行协同式解压,只有经过协同式解压之后才能进行安装使用 。
go语言是什么Go语言是一种开源的编程语言,被广泛应用于网络编程、云计算、分布式系统等领域 。
go语言的三位作者
Go语言的设计目标是成为一种语法简洁、执行效率高、并发性能强大的编程语言 。它由Google公司研发,于2009年首次发布,并于2012年成为了开源项目 。Go语言具有C语言的表达能力和Python的开发效率,同时还拥有自己独特的语法和特性 , 如协程、垃圾回收机制等 。因此,它被广泛应用于网络编程、云计算、分布式系统等领域,并且越来越受到开发者的青睐 。
Go语言的出现,填补了许多编程语言在并发编程方面的空缺 。它提供了一种轻量级线程模型,通过协程(goroutine)的方式,实现了高效的并发编程 。同时,Go语言还支持内置的网络编程和字节序列编解码库 , 使得网络编程变得更加容易和高效 。在云计算、分布式系统等领域,Go语言也得到了广泛的应用 。例如,Docker和Kubernetes等开源项目就是用Go语言开发的 。此外,Go语言还具有代码可读性高、编译速度快、编译后的可执行文件体积小等优点,使得它成为了开发高性能、高并发应用的理想语言之一 。
使用scratch构建最小化Go程序的docker image由于Golang编译之后的文件是二进制 , 而scratch是docker最基础的空image,所以可以使用scratch来构建Go程序的docker image,使得最终构建的image最小化.
构建image过程分为两步:
对于无需cgo交叉编译的程序,使用scratch来作为最终运行的基础image非常合适 。
首先,选择合适版本的golang基础image来build,这里没有必要选择更小的golang alpine,build过程中pull一般会有缓存所以pull速度差别不大,此外alpine中没有git和ssl,我们在构建image过程中都有可能用到,况且alpine也不会影响最终image大小 。
禁掉cgo交叉编译,我们服务器一般为linux amd64,build二进制文件 。
对于绝大多数go程序而言,是无需root来运行,根据docker best practice,使用non-root来运行程序能够带来更好的安全性,所以我们使用non-root用户来运行,创建一个appuser,之后再拷贝到scratch运行image中 。(scratch是空image , 所以在builder中创建user , 再拷贝 。)
多数程序可能会用到ssl,我们将builder中的crt拷贝一下即可 。(如果builder是alpine,不能拷贝,需要在alpine中apk先预装一下 。)
完整版Dockerfile
有些Go程序是需要cgo交叉编译的,例如ethereum. 对于需要cgo的程序,相对于scratch , 更推荐使用alpine来作为基础image,原因是alpine中带有libc , 并且体积也才2MB多 。而scratch中没有,当然也可以在builder中ldd依赖并拷贝到scratch中 。只是用alpine会更方便一些 。
在alpine中只要软链接一下就可以使用 。
此外,创建non-root用户的步骤也没有必要在builder中进行了,可以直接在alpine中创建 。
【go语言控制台编译体积 go语言编译工具】 完整版Dockerfile
golang程序在编译时去掉了符号信息 , 怎么逆向使用原始build编译的大小
6 , 107KB
通过去除部分连接和调试,build部分参数查看结果 。
-a 强制编译所有依赖包 。
-s 去掉符号信息
-w 去掉DWARF调试信息,得到的程序就不能用gdb调试了
不建议s和w同时使用 。
go build -ldflags -w test.go
但是体积还是有点大

推荐阅读