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

标签 c++ go google-cloud-storage executable static-linking

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

我遇到的真正问题:给定一个具有 sh 的任意容器图像二进制文件,从 Google Cloud Storage 下载文件。

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

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

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

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

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

如果我希望有一个更小的二进制文件,我应该看看其他语言(例如 C++)吗?

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

最佳答案

我认为您无法将 Go 二进制文件的大小降至 1 MiB 以下,特别是如果您必须使用功能齐全的第 3 方库,例如 GCP 存储绑定(bind)。

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

  • 如果您的环境具有解释型语言运行时(如 Python、Ruby 等),请使用它,因为您的源代码的大小就是您发布的全部内容。
  • 否则,您可能需要使用 C++。也就是说,如果您的二进制文件必须访问云存储并且您想使用包/库来执行此操作,除非您非常小心,否则 1 MiB 仍然具有挑战性。访问云存储涉及很多功能 - 安全性、HTTP/RPC 客户端等。
  • 关于c++ - 创建大小小于 1MiB 的静态二进制文件,可以从 S3 或 GCS 下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61179716/

    相关文章:

    string - 如何在不删除分隔符的情况下拆分 Golang 字符串?

    node.js - 如何使用 Google 云存储作为存储桶来在 MERN Stack 应用程序中存储用户/客户端图像?

    c++ - Qt,不能在窗口的构造函数中实例化一个对象?

    go - 如何使用 go 内部包中的统计函数 (MannWhitneyUTest)

    在 Linux 上绘制 Golang OpenGL 线,但在 Windows10 上不绘制

    google-app-engine - GAE 存储定价与 Google Cloud Storage 定价之间的差异

    python - 如何使用 Cloud Storage JSON API 检索超过 64KB 的文件?

    c++ - 这个简单的例子被认为是 RAII

    c++ - 从方法范围复制 char*

    c++ - 使用 c/c++ 将数据发送到设备/dev/eth0(或类似)的最低级别方法是什么