【问题标题】:File upload from Docker container to Google Cloud Storage将文件从 Docker 容器上传到 Google Cloud Storage
【发布时间】:2020-06-06 14:24:58
【问题描述】:

我正在 GKE 上构建一个 CI/CD 管道,基于 this guide 来自 Google。

一切都运行良好,除了因为它是一个 Django 项目,我还需要运行 collectstatic 命令并将文件上传到 Google 存储。

在 Dockerfile 我有以下命令:

RUN python manage.py collectstatic --noinput
RUN gsutil rsync -R /home/vmagent/app/myapp/static gs://mystorage/static

Collectstatic 按预期工作,但 gsutil 上传失败并显示以下错误消息:

ServiceException: 401 Anonymous caller does not have storage.objects.create access to mystorage/static/...

验证 gsutil 的最佳方法是什么?

【问题讨论】:

  • “Docker 容器中的文件”你想说什么?容器在运行时创建的文件?还是容器中包含的静态文件?你的 K8S 集群在哪里?在 GCP 上? GKE?还是其他地方?
  • @guillaumeblaquiere 抱歉不清楚,我已经编辑了帖子。集群在 GKE 上运行,文件由 Django collectstatic 命令在运行时创建。
  • 您的 VM 的默认服务帐户是什么?该服务帐户的作用是什么?另一个问题,你是如何创建集群的?有没有使用特殊参数?

标签: django docker google-cloud-storage gcloud gsutil


【解决方案1】:

如果您在 GCP (GKE) 上运行 docker 容器,则使用应用程序凭据来验证 pod,然后该 pod 具有与该服务帐户相同的权限。有关这方面的更多信息,请访问here。 GKE 和其他 kubernetes 集群都允许您将密钥文件作为机密导入。在所有 Kubernetes 平台上,这是通过以下命令完成的。完整的指南可以在here找到。

kubectl create secret generic pubsub-key --from-file=key.json=PATH-TO-KEY-FILE.json

然后像这样在清单中设置环境变量:

 env:
    - name: GOOGLE_APPLICATION_CREDENTIALS
      value: /var/secrets/google/key.json

太糟糕了,在某个角色下运行 Pod 是不可能的。 GCP 使用服务帐户运行,而不是使用 AWS 等角色。在 AWS 中,您可以将角色分配给任务,从而授予该角色下的容器权限。

【讨论】:

  • 将 pod 作为服务帐户运行听起来很有希望。那么我是否只需将spec.serviceAccountName 设置为新创建的服务帐户?
  • 进一步阅读后,GKE 上只允许使用凭据。我相应地更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 2021-04-25
  • 2018-12-23
  • 1970-01-01
  • 2018-06-20
  • 2019-06-04
  • 2020-06-13
  • 2014-09-18
  • 2019-04-08
相关资源
最近更新 更多