本地运行Cloud Run应用Docker时GCSFuse无法找到默认凭据
我正按照官方教程将Cloud Storage Bucket挂载到Cloud Run应用,该应用仅使用Docker(无cloudbuild.yaml)。使用命令docker build --platform linux/amd64 -t fusemount .构建Docker镜像无问题,随后执行docker run --rm -p 8080:8080 -e PORT=8080 fusemount启动容器,触发gcsfuse --debug_gcs --debug_fuse gs://<my-bucket> /mnt/gs命令时连接失败,报错信息为:
2022/12/11 13:54:35.325717 Start gcsfuse/0.41.9 (Go version go1.18.4) for app "" using mount point: /mnt/gcs
2022/12/11 13:54:35.618704 Opening GCS connection...
2022/12/11 13:57:26.708666 Failed to open connection: GetTokenSource: DefaultTokenSource: google: could not find default credentials. See https://developers.google.com/accounts/docs/application-default-credentials for more information.
我已通过gcloud auth application-default login配置了应用默认凭据,且同一本地机器上的Python云函数可正常访问该存储桶,请问我遗漏了什么?
- 本地Docker容器无法直接读取主机上的应用默认凭据文件,需要手动将凭据文件挂载到容器内:
- 先确认本地凭据文件路径:执行
echo $GOOGLE_APPLICATION_CREDENTIALS,若输出为空,默认路径是~/.config/gcloud/application_default_credentials.json - 修改
docker run命令,添加卷挂载参数,把主机的凭据文件映射到容器内对应路径:docker run --rm -p 8080:8080 -e PORT=8080 -v ~/.config/gcloud/application_default_credentials.json:/root/.config/gcloud/application_default_credentials.json fusemount
- 先确认本地凭据文件路径:执行
- 也可以在启动容器时指定
GOOGLE_APPLICATION_CREDENTIALS环境变量,配合卷挂载使用,灵活性更高:docker run --rm -p 8080:8080 -e PORT=8080 -e GOOGLE_APPLICATION_CREDENTIALS=/tmp/creds.json -v ~/.config/gcloud/application_default_credentials.json:/tmp/creds.json fusemount - 注意确保容器内的gcsfuse进程有读取该凭据文件的权限,必要时可在Dockerfile中添加权限设置,或者调整主机端凭据文件的读取权限。
内容的提问来源于stack exchange,提问作者Finglish

