我在运行的某些 Python 脚本中有一个(也许是独一无二的?)用例。也就是说,我想要 gsutil 的平行威力所以我不做 from google.cloud import storage ,而是我使用 subprocess调用,例如:
subprocess.Popen(["gsutil", "-q", "-m", "-o", "GSUtil:parallel_process_count=8,GSUtil:parallel_thread_count=8", "cp", files, destination])
为了从存储桶上传和下载文件。
在实例组模板中,我可以通过
-scopes 传入服务帐户,但我希望在应用程序级别处理身份验证。我尝试设置环境变量并将其传递给
subprocess :
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "keyfile.json"
tmp_env = os.environ.copy()
subprocess.Popen(['gsutil', ...], env=tmp_env)
但无济于事。运行:
gcloud auth activate-service-account --key-file /path/to/keyfile.json --project my-project -q
似乎是使用不需要 Python API 的 json key 文件进行身份验证的最佳方法。但是如果我把它放在我的 Dockerfile 的末尾,它就不起作用,虽然我当然可以把它放在我在实例组模板嵌入式 bootstrap 末尾执行的 startup.sh 脚本的末尾.sh 脚本,两者都没有真正完成我想要的。也就是说,两者都偏离了我在应用程序级别进行“gsutil 身份验证”的最初目标。
tl;dr 有没有办法将 keyfile.json 凭据传递给
gsutil ?这是 gsutil 团队讨论过的功能吗?如果我没有足够好地寻找 Cloud Platform 和 gsutil 文档,我深表歉意。
请您参考如下方法:
您可以提供指向 gsutil 的 JSON key 文件的指针。在您的 .boto配置文件如下:
[Credentials]
gs_service_key_file = /path/to/your/keyfile.json
这相当于运行
gsutil config -e对于独立(非
gcloud)安装。
如果你想在命令行上提供这个而不是在你的
.boto配置文件,可以使用
-o参数类似于您在命令行中配置进程和线程计数的方式。以机智:
subprocess.Popen(["gsutil", "-q", "-m", "-o", "Credentials:gs_service_key_file=/path/to/your/keyfile.json",
"-o", "GSUtil:parallel_process_count=8", "-o", GSUtil:parallel_thread_count=8", "cp", files, destination])
请注意,您需要确保可以从容器内访问 key 文件路径。




