0

如何在实例启动时将文件从 GCP 存储桶下载到容器优化操作系统 (COS)?


我知道以下解决方案:

然而,所有这些都必须在实例启动后手动和外部完成。

还有cloud init,但我找不到有关如何从存储桶复制文件的任何信息。示例似乎表明最好将文件内容直接包含在云初始化文件中,因为安全性,这不是我想做的事情。是否可以使用 cloud init 从 Storge 存储桶下载文件?

我考虑过使用启动脚本gcloud,但 COS 缺少 CLI 工具,例如gsutil无法在启动脚本中运行任何此类命令。

我知道我可以手动复制文件,然后将映像保存为启动盘,但我希望有一些解决方案可以避免这样做。

最重要的是,我假设我不是在要求不可能的事情,因为 COS 实例设置允许我指定可以挂载到起始容器上的 Docker 卷。这似乎表明,当 COS 尝试在启动时运行我的映像时,我应该能够在实例上拥有一些私有文件。但是怎么做?

gcp_volume_mount


尝试使用 cloud-sdk 映像执行启动脚本并按照 Guillaume 的建议将文件复制到那里并没有为我工作一段时间,显示此日志。最终我意识到cloud-sdk图像在未压缩时为 2.41GB,需要 2 多分钟才能完成拉取。我再次尝试了一个空的 COS 实例,启动脚本成功完成,从存储桶下载数据。

然而,一个 2.41GB 的图像和超过 2 分钟的启动时间听起来有点像下载一个 2KB 的文件。不是吗?

我很高兴看到我的问题的有效解决方案(感谢纪尧姆!)尽管我仍然想知道:没有更好的方法来做到这一点吗?我觉得这种方法比手动把文件放到COS实例上,然后创建一个机器映像以备将来使用更不整洁。

4

2 回答 2

3

根据 Guillaume 的回答,我创建并发布了一个gsutil 包装器图像,以voyz/gsutil_wrap. 这样我就可以使用以下命令运行启动脚本:

docker run -v /host/path:/container/path \
  --entrypoint gsutil voyz/gsutil_wrap \
  cp gs://bucket/path /container/path

它本质上是Guillaume 建议的副本,但它使用的图像仅包含运行gsutil所需的最低设置。google/cloud-sdk因此,它的重量为 0.22GB,平均在 10-20 秒内拉出 - 而Guillaume 建议的图像分别为 2.41GB 和 2 分钟以上。

另外,感谢这个非常有用的 StackOverflow 答案,它允许 gsutil 使用默认服务帐户进行身份验证。

于 2020-10-29T05:13:47.790 回答
2

启动脚本是执行此操作的正确位置。是的,COS 缺少一些有用的库。

但是你可以运行容器!例如,Google Cloud SDK 容器!

因此,在 VM 元数据中添加此启动脚本:

  • 键->startup-script
  • 价值->
docker run -v /local/path/to/copy/files:/dummy/container/path \
  --entrypoint gsutil google/cloud-sdk \
  cp gs://your_bucket/path/to/file /dummy/container/path

注意:启动脚本以 root 模式运行。如果需要更改文件访问模式,请在启动脚本中执行 chmod/chown。

如果您需要有关此命令行的更多说明,请告诉我


当然,使用新鲜的 COS 镜像,启动时间是相当长的(拉取容器镜像并解压)。

为了减少启动时间,您可以“烘焙”您的图像。我的意思是,从 COS 开始,在其上下载/安装您想要的内容(或仅执行容器的一个)并docker pull从中创建自定义映像googkle/cloud-sdk

像这样,所有必需的依赖项都将出现在映像上,并且启动启动会更快。

于 2020-10-27T20:13:19.487 回答