code: def build_anyscale_custom_byod_image(test: Test) -> None:
      if not test.require_custom_byod_image():
          logger.info(
              f"Test {test.get_name()} does not require a custom byod image"
          )
          return
      byod_image = test.get_anyscale_byod_image()
      if _image_exist(byod_image):
          logger.info(f"Image {byod_image} already exists")
          return
  
      env = os.environ.copy()
      env["DOCKER_BUILDKIT"] = "1"
      subprocess.check_call(
          [
              "docker",
              "build",
              "--build-arg",
              f"BASE_IMAGE={test.get_anyscale_base_byod_image()}",
              "--build-arg",
              f"POST_BUILD_SCRIPT={test.get_byod_post_build_script()}",
              "-t",
              byod_image,
              "-f",
              os.path.join(RELEASE_BYOD_DIR, "byod.custom.Dockerfile"),
              RELEASE_BYOD_DIR,
          ],
          stdout=sys.stderr,
          env=env,
      )
      _validate_and_push(byod_image)
  
file_path: ray/release/ray_release/byod/build.py
imports: from typing import List, Optional, Dict
  import boto3
  import hashlib
  import os
  import subprocess
  import sys
  import time
  from ray_release.config import RELEASE_PACKAGE_DIR
  from ray_release.configs.global_config import get_global_config
  from ray_release.logger import logger
  from ray_release.test import Test, DATAPLANE_ECR_REPO, DATAPLANE_ECR_ML_REPO
label_desc: Use image node_id 2 for calling a global function with example usage: build_anyscale_custom_byod_image(test) without return types