从存储到计算实例运行容器的`gsutil cp`不会复制文件

Posted

技术标签:

【中文标题】从存储到计算实例运行容器的`gsutil cp`不会复制文件【英文标题】:`gsutil cp` from Storage to compute instance running container doesn't copy files 【发布时间】:2018-09-07 20:18:27 【问题描述】:

我正在运行一个带有 coreos 容器的 Google 计算实例(图像名称:coreos-stable-1688-4-0-v20180327)。使用gsutil 将文件从存储复制到本地文件系统似乎工作正常——除了假定复制的文件实际上没有出现在文件系统上。在不使用容器的情况下在计算实例上运行相同的复制命令确实有效,所以我想问题出在容器上。但是,我不确定容器导致复制失败的原因。

命令是gsutil cp -r gs://my-bucket ./

【问题讨论】:

【参考方案1】:

您遇到了https://github.com/GoogleCloudPlatform/gsutil/issues/453 中描述的问题。为gsutil 设置了一个别名,它在容器中运行 gsutil(它无权访问主机文件系统),因此文件被复制到该容器的文件系统,而不是您的 GCE 主机的文件系统。该线程中建议了一些解决方法。


编辑以便更好地阅读 (来自 GitHub 问题线程的信息):

看起来 GCE 虚拟机为 gsutil 设置了一个 nifty 别名:

$ type gsutil
gsutil is aliased to `(docker images google/cloud-sdk || docker pull google/cloud-sdk) > /dev/null;docker run -t -i --net=host -v /home/<USER>/.config:/root/.config google/cloud-sdk gsutil'

CoreOS 实例上的潜在解决方法

克隆gsutil repo,运行git checkout &lt;tag&gt;以获取最新版本的提交,通过these instructions安装Python,然后确保直接在CoreOS主机上运行gsutil的本地副本,而不是运行gsutil 的容器化版本。 覆盖gsutil 别名,或创建一个新别名,以便将主机文件系统的某些部分挂载到容器上;这允许您在容器终止后访问新写入的文件。

【讨论】:

啊啊啊啊就是这样,谢谢!我认为 gsutil 停止从脚本、新 shell 或 root 中访问真的很奇怪,它似乎没有将绝对路径识别为有效,并且它在第一次运行时拉出了某种容器 XD现在一切都说得通了,哈哈。

以上是关于从存储到计算实例运行容器的`gsutil cp`不会复制文件的主要内容,如果未能解决你的问题,请参考以下文章

GSUTIL CP 使用文件大小

如何使用 gsutil 从 GCE 上的容器中复制存储桶中的文件

使用 python 子进程在实例上运行 gsutil - 访问权限?

gsutil cp 通信问题

权限被拒绝的 gsutil cp 错误

gsutil cp 命令会影响我的带宽限制配额吗?