You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:13:11