将文件从 GCP 存储桶复制到 Container-Optimised OS

Copy files to Container-Optimised OS from a GCP Storage bucket

如何在实例启动时将文件从 GCP 存储桶下载到 Container-Optimised OS (COS)?


我知道以下解决方案:

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

还有cloud init, yet I can't find any info on how to copy files from a Storage bucket. Examples seem to be suggesting直接在cloud init文件中包含文件内容比较好,因为安全我不想这么做。是否可以使用 cloud init 从 Storge 存储桶下载文件?

我考虑过使用 startup script,但 COS 缺少 CLI 工具,例如 gcloudgsutil 能够 运行 任何此类命令在启动脚本中。

我知道我可以手动复制文件,然后将图像另存为 boot disk,但我希望有解决方案可以避免这样做。

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


正在尝试使用 cloud-sdk 映像执行启动脚本并在那里复制文件 didn't work for me for a while, showing this log。最终我意识到 cloud-sdk 图像在未压缩时为 2.41GB,需要 2 分钟以上才能完成拉取。我再次尝试使用空 COS 实例,启动脚本成功完成,从存储桶下载数据。

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

我很高兴看到我的问题得到了有效的解决方案(感谢 Guillaume!),尽管我仍然想知道:难道没有更好的方法来解决这个问题吗?感觉这个方法比手动把文件放到COS实例上,然后创建一个机器镜像以后用

更不整洁

startup-script 是执行此操作的正确位置。是的,COS 缺少一些有用的库。

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

因此,在 VM 元数据中添加此 startup-script:

  • 键 -> 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 开始,download/install 你想要什么(或者只执行 googkle/cloud-sdk 容器的 docker pull)和 create a custom image from this.

这样,所有需要的依赖项都会出现在镜像中,启动会更快。

根据 Guillaume 的回答,我使用以下命令创建并发布了一个 gsutil wrapper image, available as voyz/gsutil_wrap. This way I am able to run a startup-script

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

它本质上是 , except it is using an image containing only a minimum setup required to run gsutil 的副本。因此,它的重量为 0.22GB,平均拉取时间为 10-20 秒 - 而 Guillaume 建议的 google/cloud-sdk 图片分别为 2.41GB 和超过 2 分钟。

此外,感谢 允许 gsutil 使用默认服务帐户进行身份验证。