将文件从 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 上运行,文件由 Djangocollectstatic
命令在运行时创建。
您的 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 分钟