创建一个大小小于1MiB的静态二进制文件,可以从S3或GCS下载文件



我知道这个问题看起来可能太具体了,但我认为答案对其他领域也很有用。

我遇到的真正问题是:给定一个具有sh二进制文件的任意容器映像,从谷歌云存储下载一个文件。

由于下载器二进制文件不存在于用户映像中,我有一个想法,将编码的二进制文件放在命令行中(有点类似于python -c <code>等内联脚本(。然而,命令行大小(~1MiB(有限制,所以二进制文件应该比这个小。

我之所以决定使用Go,是因为创建静态链接的二进制文件很容易,而且人们报告说Go二进制文件很小。

我已经编写了一个Go程序,它使用cloud.google.com/go/storage模块创建一个客户端并读取blobstorage.NewClient().Bucket(bucket).Object(object).NewReader()

不幸的是,这个简单程序的二进制文件原来是15MiB。添加go build -ldflags=" -s -w"(如How to reduced file size?中所建议的(可将其减少到10MiB。这仍然比我的预算规模高出一个数量级。

我可以使用二进制优化或修剪技术吗?

如果我想要一个更小的二进制,我应该看看其他语言(例如C++(吗?

如果我尝试使用一些通用的REST客户端库,我会有更好的运气吗//看起来没有——使用http.Get的精简Go程序的大小是5MiB。

我认为您无法将Go二进制文件的大小降低到1MIB以下,特别是如果您必须使用功能完整的第三方库,如GCP存储绑定。

奇怪的是,在这个时代,你有1 MiB的限制,但如果真的是这样的话,我建议:

  1. 如果您的环境有一个解释语言运行时(如Python、Ruby等(,请使用它,因为源代码的大小就是您所需的
  2. 否则,您可能需要使用一些C++。也就是说,如果你的二进制文件必须访问云存储,并且你想使用包/库来做到这一点,那么除非你非常小心,否则1 MiB仍然是一个挑战。访问云存储涉及到很多功能——安全、HTTP/RPC客户端等

最新更新