我有一个使用 Google API 的 Django 项目。我创建了一个 docker-compose.yml,其中包含 Django 容器和 Nginx 容器。它构建成功,但是当我运行 docker-compose up 时,出现以下错误:
google.auth.exceptions.DefaultCredentialsError:找不到文件/file/path/credentials.json。
我已经安装了 Google SDK 并运行了“gcloud auth application-default login”,这会在我的根目录中创建 json 文件。然后我为其创建了一个环境变量并配置了我的 Django 应用程序。
设置.py:
GOOGLE_APPLICATION_CREDENTIALS = os.environ["GOOGLE_APPLICATION_CREDENTIALS"]
我可以在查找器中打开凭证 json 文件,这样我就知道它在那里。
secret 管理器正在使用 Google API 来检索 secret key :
from google.cloud import secretmanager
import environ
env = environ.Env()
environ.Env.read_env()
def get_secret(secret_id, version_id="latest"):
project_id = env("GOOGLE_PROJECT_ID")
client = secretmanager.SecretManagerServiceClient()
name = f"projects/{project_id}/secrets/{secret_id}/versions/{version_id}"
response = client.access_secret_version(name=name)
return response.payload.data.decode("UTF-8")
在不运行 docker-compose up 的情况下,它可以正常工作,我可以检索 key ,但我想在运行我的 docker 容器时对其进行测试。
我的 docker-compose.yml:
version: '3'
services:
backend:
build:
context: ./
dockerfile: ./Dockerfile
env_file:
- ./backend/.env
container_name: backend
ports:
- 8000:8000
nginx:
build:
context: ./nginx
dockerfile: ./Dockerfile
container_name: nginx
ports:
- 80:80
depends_on:
- backend
我什至尝试下载服务帐户 key ,将其放在我的下载文件夹中
当我将文件移动到 django 项目中时,它可以准备好它,但根据我的理解,源代码中不应该有凭据文件。那么我应该在哪里存储凭据才能安全地工作?
最佳答案
这里缺少两个步骤来使用容器中的本地服务帐户,而不实际将其存储在那里或将其添加到您的 git 存储库:
我会笼统地说一下,然后您可以将它们添加到您的 docker-compose.yml
中:
Google 服务应该在哪里查看
环境变量 GOOGLE_APPLICATION_CREDENTIALS
告诉 Google 服务应在容器中的何处查找服务帐户。因此,在您的服务中,设置一个带有绝对路径的环境变量在容器中这些 Google 服务应该在其中查找:
services:
backend:
build:
context: ./
dockerfile: ./Dockerfile
environment:
GOOGLE_APPLICATION_CREDENTIALS: /tmp/keys/application_default_credentials.json
env_file:
- ./backend/.env
从本地计算机映射
因为您不想将服务帐户存储在存储库中,所以需要在 docker-compose.yml
中设置一个映射上述内容的 volume
GOOGLE_APPLICATION_CREDENTIALS
添加到本地计算机上的服务帐户。如果您的服务帐户位于 /jdez/Downloads/service-account.json
,您将按如下方式设置卷:
services:
backend:
build:
context: ./
dockerfile: ./Dockerfile
environment:
GOOGLE_APPLICATION_CREDENTIALS: /tmp/keys/application_default_credentials.json
env_file:
- ./backend/.env
volumes:
- /jdez/Downloads/service-account.json:/tmp/keys/application_default_credentials.json
现在,当 Google 服务在 GOOGLE_APPLICATION_CREDENTIALS
查找该文件时,它们会读取您的Downloads
目录中的文件。
由于您使用的是服务帐户,因此您甚至不需要运行 gcloud
,除非您需要它用于其他用途。
关于python - 在 Django 项目中哪里安全地存储 Google_Application_Credentials?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75645717/