5

为什么 gsutil 在 Cloud Shell 上的 docker 容器中运行时不使用 Gcloud 凭据?

根据 [1] gsutil 应在可用时使用 gcloud 凭据:

一旦通过 gcloud auth 配置了凭据,无论用户是否有任何 boto 配置文件(除非在 BOTO_CONFIG 环境变量中指定了不同的路径,这些文件都位于 ~/.boto ),都将使用这些凭据。但是,如果需要一种未存储在 gcloud 凭证存储中的非 GCS 凭证(例如,S3 帐户的 HMAC 凭证),gsutil 仍将在 boto 配置文件中查找凭证。

这在 gcloud 安装中似乎可以正常工作,但在 docker 映像中却不行。我在 Cloud Shell 中使用的流程是:

docker run -ti --name gcloud-config google/cloud-sdk gcloud auth login
docker run --rm -ti --volumes-from gcloud-config google/cloud-sdk gcloud compute instances list --project my_project
... (works ok)

docker run --rm -ti --volumes-from gcloud-config google/cloud-sdk gsutil ls gs://bucket/

ServiceException: 401 Anonymous caller does not have storage.objects.list access to bucket.

[1] https://cloud.google.com/storage/docs/gsutil/addlhelp/CredentialTypesSupportingVariousUseCases

4

3 回答 3

5

您需要使用您的凭据安装卷:

docker run -v ~/.config/gcloud:/root/.config/gcloud your_docker_image
于 2018-06-12T15:06:47.953 回答
1

以下步骤为我解决了这个问题:

  1. 在 boto 配置文件gs_service_key_file的部分中设置(请参见此处[Credentials]
  2. 激活您的服务帐户gcloud auth activate-service-account
  3. 将您的默认项目设置为gcloud config

Dockerfile 截图:

ENV GOOGLE_APPLICATION_CREDENTIALS=/.gcp/your_service_account_key.json
ENV GOOGLE_PROJECT_ID=your-project-id

RUN echo '[Credentials]\ngs_service_key_file = /.gcp/your_service_account_key.json' \
    > /etc/boto.cfg
RUN mkdir /.gcp
COPY your_service_account_key.json $GOOGLE_APPLICATION_CREDENTIALS


RUN gcloud auth activate-service-account --key-file=$GOOGLE_APPLICATION_CREDENTIALS --project $GOOGLE_PROJECT_ID
RUN gcloud config set project $GOOGLE_PROJECT_ID
于 2021-10-07T07:25:32.503 回答
0

我发现@Alexandre 的回答基本上对我有用,除了一个问题:我的凭据适用于bq,但不适用于gsutil(OP 问题的主题),它返回

ServiceException: 401 Anonymous caller does not have storage.objects.list access to bucket

相同的凭据如何适用于其中一个而不适用于另一个!?

最终我找到了它:~/.config/configurations/config_default看起来像这样:

[core]
account = xxx@xxxxxxx.xxx
project = xxxxxxxx
pass_credentials_to_gsutil = false

为什么?!为什么没有记录?

无论如何...将标志更改为true,并且您都已排序。

于 2019-12-19T16:32:20.863 回答