在Google Batch作业容器中访问ADC(默认应用凭据)失败求助
Google Batch容器实例无法获取默认应用凭据(ADC)的问题
我正在试用Google Batch服务,通过预构建Docker镜像在Compute Engine虚拟机上运行Python脚本,希望在Docker实例内访问默认应用凭据(ADC),但无法成功获取。运行脚本后输出Service account email: default,且GOOGLE_APPLICATION_CREDENTIALS环境变量未设置。手动通过key.json文件配置可以正常工作,但希望避免这种方式。
我的配置与代码
job.json配置
{ "taskGroups": [ { "taskSpec": { "runnables": [ { "container": { "imageUri": "europe-west3-docker.pkg.dev/project-id/containers/service:v1" } } ] } } ], "allocationPolicy": { "serviceAccount": { "email": "sa-test@some-project.iam.gserviceaccount.com" } }, "logsPolicy": {"destination": "CLOUD_LOGGING"} }
Dockerfile内容
FROM python:3.10 WORKDIR /app ENV PATH $PATH:$HOME/.local/bin COPY . . RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt ENTRYPOINT ["python", "main.py"]
main.py代码
import google.auth credentials, _ = google.auth.default() print(f"Service account email: {credentials.service_account_email}")
问题原因
当前配置中,虽然在allocationPolicy指定了服务账号,但Google Batch默认不会自动将VM的服务账号凭据挂载到Docker容器内部。容器内的default凭据其实是容器自身的默认服务账号,并非你指定的VM级别服务账号。
解决方案
需要在Batch任务的container配置中添加卷挂载和环境变量设置,将VM的元数据服务器凭据路径挂载到容器内,并指定GOOGLE_APPLICATION_CREDENTIALS环境变量指向该路径。
修改后的job.json配置如下:
{ "taskGroups": [ { "taskSpec": { "runnables": [ { "container": { "imageUri": "europe-west3-docker.pkg.dev/project-id/containers/service:v1", "volumes": [ { "hostPath": "/run/secrets/google-service-account", "containerPath": "/run/secrets/google-service-account" } ], "env": [ { "name": "GOOGLE_APPLICATION_CREDENTIALS", "value": "/run/secrets/google-service-account/token" } ] } } ] } } ], "allocationPolicy": { "serviceAccount": { "email": "sa-test@some-project.iam.gserviceaccount.com", "scopes": [ "https://www.googleapis.com/auth/cloud-platform" ] } }, "logsPolicy": {"destination": "CLOUD_LOGGING"} }
关键修改点说明
- 挂载凭据卷:将VM上的
/run/secrets/google-service-account路径挂载到容器内相同路径,该路径是Compute Engine自动为指定服务账号生成的临时凭据存放位置。 - 设置环境变量:指定
GOOGLE_APPLICATION_CREDENTIALS指向容器内的凭据文件路径,让google.auth库自动识别并加载正确凭据。 - 添加权限范围:在
serviceAccount中补充scopes,确保服务账号拥有所需权限范围(这里用cloud-platform作为通用范围,可根据实际需求调整)。
验证修改
重新提交Batch任务后,main.py将正确输出指定服务账号的邮箱地址,而非default。
内容的提问来源于stack exchange,提问作者Sylver11
相关产品推荐
相关产品推荐

