python/base_component_image/build-push.py (53 lines of code) (raw):

# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import docker, os, yaml from argparse import ArgumentParser, ArgumentTypeError def run( dockerfile_path: str, tag: str, nocache: bool =False, quiet: bool =True): """ This function builds and pushes a Docker image to a specified repository. Args: dockerfile_path (str): The path to the Dockerfile. tag (str): The tag for the Docker image. nocache (bool, optional): Whether to disable the Docker cache. Defaults to False. quiet (bool, optional): Whether to suppress output from the Docker build process. Defaults to True. Raises: FileNotFoundError: If the Dockerfile does not exist. ArgumentTypeError: If the Dockerfile path is not a string or the tag is not a string. """ client = docker.from_env() client.images.build(path = dockerfile_path, tag=tag, nocache=nocache, quiet=quiet) client.images.push(repository=tag) def check_extention( file_path: str, type: str = '.yaml'): """ This function checks if a file exists and has the specified extension. Args: file_path (str): The path to the file. type (str, optional): The file extension to check for. Defaults to '.yaml'. Returns: str: The file path if it exists and has the specified extension. Raises: FileNotFoundError: If the file does not exist. ArgumentTypeError: If the file path is not a string or the type is not a string. """ if not isinstance(file_path, str): raise ArgumentTypeError("file_path must be a string") if not isinstance(type, str): raise ArgumentTypeError("type must be a string") if os.path.exists(file_path): if not file_path.lower().endswith(type): raise ArgumentTypeError(f"File provited must be {type}: {file_path}") else: raise FileNotFoundError(f"{file_path} does not exist") return file_path if __name__ == "__main__": """ Script that builds and pushes a Docker image to a specified repository. It takes the following arguments: Args: -c: Path to the configuration YAML file. -p: Path to the Dockerfile. -nc: Whether to disable the Docker cache (optional, defaults to False). """ parser = ArgumentParser() parser.add_argument("-c", "--config-file", dest="config", required=True, type=check_extention, help="path to config YAML file (dev.yaml or prod.yaml)") parser.add_argument("-p", "--dockerfile-path", dest="path", default=os.path.dirname(__file__), #assumes the docker file is in the same path as this script type=str, help="path to Dockerfile") parser.add_argument("-nc", '--nocache', dest="nocache", type=bool, default=False, help='Option to disable cache. False is default') args = parser.parse_args() repo_params={} components_params={} with open(args.config, encoding='utf-8') as fh: configs = yaml.full_load(fh) components_params = configs['vertex_ai']['components'] repo_params = configs['artifact_registry']['pipelines_docker_repo'] tag = f"{repo_params['region']}-docker.pkg.dev/{repo_params['project_id']}/{repo_params['name']}/{components_params['base_image_name']}:{components_params['base_image_tag']}" # This script provides a convenient way to build and push Docker images for Vertex AI pipelines. if True: import os os.system(f"cd '{args.path}' && gcloud builds submit --project={repo_params['project_id']} --region={repo_params['region']} --tag {tag}") else: run(args.path, tag, args.nocache)