使用Python客户端调用GCP Cloud Run Job并覆盖环境变量报错
问题:Python触发GCP Cloud Run Job并覆盖环境变量时报错
尝试通过Python脚本触发已存在的GCP Cloud Run Job,需要覆盖环境变量,但执行时出现如下错误:
TypeError: Message must be initialized with a dict: google.cloud.run.v2.RunJobRequest
原代码
env_vars = [ run_v2.EnvVar(name="VAR_1", value="var_1_value"), run_v2.EnvVar(name="VAR_2", value="var_2_value"), ] # Set the env vars as container overrides container_overrides = run_v2.RunJobRequest.Overrides.ContainerOverride( name="myjobname", env=env_vars ) request_override = run_v2.RunJobRequest.Overrides( container_overrides=container_overrides ) # Initialize the request job_name = f"projects/myproject/locations/mylocation/jobs/myjob" request = run_v2.RunJobRequest( name=job_name, overrides=request_override ) # Make the request operation = client.run_job(request=request) logging.info("Waiting for operation to complete...") response = operation.result() logging.info(f"Operation result: {response}")
错误原因
RunJobRequest.Overrides的container_overrides字段是列表类型(重复字段),原代码中传入了单个ContainerOverride对象而非列表,导致Proto消息初始化时类型不匹配,触发错误。
修正后的代码
env_vars = [ run_v2.EnvVar(name="VAR_1", value="var_1_value"), run_v2.EnvVar(name="VAR_2", value="var_2_value"), ] # 构建容器覆盖配置 container_overrides = run_v2.RunJobRequest.Overrides.ContainerOverride( name="myjobname", env=env_vars ) # 注意:container_overrides需要传入列表 request_override = run_v2.RunJobRequest.Overrides( container_overrides=[container_overrides] ) # 初始化请求 job_name = f"projects/myproject/locations/mylocation/jobs/myjob" request = run_v2.RunJobRequest( name=job_name, overrides=request_override ) # 发起请求并等待结果 operation = client.run_job(request=request) logging.info("Waiting for operation to complete...") response = operation.result() logging.info(f"Operation result: {response}")
备选方案(更稳妥的字典初始化方式)
如果遇到Proto消息初始化的其他问题,可以直接用字典格式构建请求对象,避免类型匹配问题:
job_name = f"projects/myproject/locations/mylocation/jobs/myjob" request = run_v2.RunJobRequest({ "name": job_name, "overrides": { "container_overrides": [ { "name": "myjobname", "env": [ {"name": "VAR_1", "value": "var_1_value"}, {"name": "VAR_2", "value": "var_2_value"} ] } ] } }) operation = client.run_job(request=request) logging.info("Waiting for operation to complete...") response = operation.result() logging.info(f"Operation result: {response}")
内容的提问来源于stack exchange,提问作者Raimundo Manterola
相关产品推荐
相关产品推荐

