将文件从 Docker 容器上传到 Google Cloud Storage

Posted

技术标签:

【中文标题】将文件从 Docker 容器上传到 Google Cloud Storage【英文标题】:File upload from Docker container to 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 的默认服务帐户是什么?该服务帐户的作用是什么?另一个问题,你是如何创建集群的?有没有使用特殊参数? 【参考方案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 上只允许使用凭据。我相应地更新了我的答案。

以上是关于将文件从 Docker 容器上传到 Google Cloud Storage的主要内容,如果未能解决你的问题,请参考以下文章

将 env 变量从 Google 的 Secret Manager 加载到在 Google Cloud Run 上运行但未通过 Cloud Build 部署的 Docker 容器中?

从 Google Cloud Run 服务中的 docker 容器到 Google Cloud SQL 的请求最多需要 2 分钟

[Docker] Windows 宿主环境下,共享或上传文件到容器的方法

如何将文件从 docker 容器共享到主机

容器镜像-介绍

docker 和 FastDFS上传和下载文件