From c061114c802b6094ad10d9311084aba206981be7 Mon Sep 17 00:00:00 2001 From: Zheng Chen Date: Fri, 8 Aug 2025 18:07:00 +0000 Subject: [PATCH 1/4] Merge --base-docker-image and --docker-image flag --- src/xpk/core/docker_image.py | 143 ++++++++++++++++++++++++----------- 1 file changed, 97 insertions(+), 46 deletions(-) diff --git a/src/xpk/core/docker_image.py b/src/xpk/core/docker_image.py index 7425b0fd6..410c17f05 100644 --- a/src/xpk/core/docker_image.py +++ b/src/xpk/core/docker_image.py @@ -150,6 +150,67 @@ def build_docker_image_from_base_image(args, verbose=True) -> tuple[int, str]: return return_code, cloud_docker_image + +# def setup_docker_image(args) -> tuple[int, str]: +# """Does steps to verify docker args, check image, and build image (if asked). + +# Args: +# args: user provided arguments for running the command. + +# Returns: +# tuple: +# 0 if successful and 1 otherwise. +# Name of the docker image to use. +# """ +# use_base_docker_image = use_base_docker_image_or_docker_image(args) + +# docker_image = args.base_docker_image +# if use_base_docker_image: +# validate_docker_image_code = validate_docker_image(docker_image, args) +# if validate_docker_image_code != 0: +# xpk_exit(validate_docker_image_code) +# build_docker_image_code, docker_image = build_docker_image_from_base_image( +# args +# ) +# if build_docker_image_code != 0: +# xpk_exit(build_docker_image_code) +# else: +# docker_image = args.docker_image +# validate_docker_image_code = validate_docker_image(args.docker_image, args) +# if validate_docker_image_code != 0: +# xpk_exit(validate_docker_image_code) + +# return 0, docker_image + + +# def use_base_docker_image_or_docker_image(args) -> bool: +# """Checks for correct docker image arguments. + +# Args: +# args: user provided arguments for running the command. + +# Returns: +# True if intended to use base docker image, False to use docker image. +# """ +# use_base_docker_image = True +# # Check if (base_docker_image and script_dir) or (docker_image) is set. +# if args.docker_image is not None: +# if args.script_dir is not DEFAULT_SCRIPT_DIR: +# xpk_print( +# '`--script-dir` and --docker-image can not be used together. Please' +# ' see `--help` command for more details.' +# ) +# xpk_exit(1) +# if args.base_docker_image is not DEFAULT_DOCKER_IMAGE: +# xpk_print( +# '`--base-docker-image` and --docker-image can not be used together.' +# ' Please see `--help` command for more details.' +# ) +# xpk_exit(1) +# use_base_docker_image = False +# return use_base_docker_image + + def setup_docker_image(args) -> tuple[int, str]: """Does steps to verify docker args, check image, and build image (if asked). @@ -161,50 +222,40 @@ def setup_docker_image(args) -> tuple[int, str]: 0 if successful and 1 otherwise. Name of the docker image to use. """ - use_base_docker_image = use_base_docker_image_or_docker_image(args) - - docker_image = args.base_docker_image - if use_base_docker_image: - validate_docker_image_code = validate_docker_image(docker_image, args) - if validate_docker_image_code != 0: - xpk_exit(validate_docker_image_code) - build_docker_image_code, docker_image = build_docker_image_from_base_image( - args - ) - if build_docker_image_code != 0: - xpk_exit(build_docker_image_code) - else: - docker_image = args.docker_image - validate_docker_image_code = validate_docker_image(args.docker_image, args) - if validate_docker_image_code != 0: - xpk_exit(validate_docker_image_code) - - return 0, docker_image - -def use_base_docker_image_or_docker_image(args) -> bool: - """Checks for correct docker image arguments. - - Args: - args: user provided arguments for running the command. - - Returns: - True if intended to use base docker image, False to use docker image. - """ - use_base_docker_image = True - # Check if (base_docker_image and script_dir) or (docker_image) is set. - if args.docker_image is not None: - if args.script_dir is not DEFAULT_SCRIPT_DIR: - xpk_print( - '`--script-dir` and --docker-image can not be used together. Please' - ' see `--help` command for more details.' - ) - xpk_exit(1) - if args.base_docker_image is not DEFAULT_DOCKER_IMAGE: - xpk_print( - '`--base-docker-image` and --docker-image can not be used together.' - ' Please see `--help` command for more details.' - ) - xpk_exit(1) - use_base_docker_image = False - return use_base_docker_image + docker_image = args.docker_image + if not docker_image or docker_image == DEFAULT_DOCKER_IMAGE: + docker_image = args.base_docker_image # fallback for legacy users + + if not docker_image or docker_image == DEFAULT_DOCKER_IMAGE: + xpk_print("Error: No docker image specified. Please provide --docker-image.") + xpk_exit(1) + + cloud_prefixes = [ + "gcr.io", "docker.pkg.dev", "us-docker.pkg.dev" + ] + is_cloud_image = any(docker_image.startswith(prefix) for prefix in cloud_prefixes) + + if is_cloud_image: + if args.script_dir is not DEFAULT_SCRIPT_DIR: + xpk_print( + "Error: `--script-dir` cannot be used with a cloud docker image.\n" + "Hint: If you need to customize the image with local scripts, " + "use a local base image (e.g., `ubuntu:20.04`) instead of a prebuilt cloud image." + ) + xpk_exit(1) + + validate_code = validate_docker_image(docker_image, args) + if validate_code != 0: + xpk_exit(validate_code) + + else: + validate_code = validate_docker_image(docker_image, args) + if validate_code != 0: + xpk_exit(validate_code) + + build_code, docker_image = build_docker_image_from_base_image(args) + if build_code != 0: + xpk_exit(build_code) + + return 0, docker_image From 132179310c8ff6a5f264a355b9e9422e75ab2a18 Mon Sep 17 00:00:00 2001 From: Zheng Chen Date: Fri, 8 Aug 2025 18:31:54 +0000 Subject: [PATCH 2/4] fix pylint issue --- src/xpk/core/docker_image.py | 76 ++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/src/xpk/core/docker_image.py b/src/xpk/core/docker_image.py index 410c17f05..f51c5df6d 100644 --- a/src/xpk/core/docker_image.py +++ b/src/xpk/core/docker_image.py @@ -150,7 +150,6 @@ def build_docker_image_from_base_image(args, verbose=True) -> tuple[int, str]: return return_code, cloud_docker_image - # def setup_docker_image(args) -> tuple[int, str]: # """Does steps to verify docker args, check image, and build image (if asked). @@ -223,39 +222,42 @@ def setup_docker_image(args) -> tuple[int, str]: Name of the docker image to use. """ - docker_image = args.docker_image - if not docker_image or docker_image == DEFAULT_DOCKER_IMAGE: - docker_image = args.base_docker_image # fallback for legacy users - - if not docker_image or docker_image == DEFAULT_DOCKER_IMAGE: - xpk_print("Error: No docker image specified. Please provide --docker-image.") - xpk_exit(1) - - cloud_prefixes = [ - "gcr.io", "docker.pkg.dev", "us-docker.pkg.dev" - ] - is_cloud_image = any(docker_image.startswith(prefix) for prefix in cloud_prefixes) - - if is_cloud_image: - if args.script_dir is not DEFAULT_SCRIPT_DIR: - xpk_print( - "Error: `--script-dir` cannot be used with a cloud docker image.\n" - "Hint: If you need to customize the image with local scripts, " - "use a local base image (e.g., `ubuntu:20.04`) instead of a prebuilt cloud image." - ) - xpk_exit(1) - - validate_code = validate_docker_image(docker_image, args) - if validate_code != 0: - xpk_exit(validate_code) - - else: - validate_code = validate_docker_image(docker_image, args) - if validate_code != 0: - xpk_exit(validate_code) - - build_code, docker_image = build_docker_image_from_base_image(args) - if build_code != 0: - xpk_exit(build_code) - - return 0, docker_image + docker_image = args.docker_image + if not docker_image or docker_image == DEFAULT_DOCKER_IMAGE: + docker_image = args.base_docker_image # fallback for legacy users + + if not docker_image or docker_image == DEFAULT_DOCKER_IMAGE: + xpk_print( + 'Error: No docker image specified. Please provide --docker-image.' + ) + xpk_exit(1) + + cloud_prefixes = ['gcr.io', 'docker.pkg.dev', 'us-docker.pkg.dev'] + is_cloud_image = any( + docker_image.startswith(prefix) for prefix in cloud_prefixes + ) + + if is_cloud_image: + if args.script_dir is not DEFAULT_SCRIPT_DIR: + xpk_print( + 'Error: `--script-dir` cannot be used with a cloud docker' + ' image.\nHint: If you need to customize the image with local' + ' scripts, use a local base image (e.g., `ubuntu:20.04`) instead of a' + ' prebuilt cloud image.' + ) + xpk_exit(1) + + validate_code = validate_docker_image(docker_image, args) + if validate_code != 0: + xpk_exit(validate_code) + + else: + validate_code = validate_docker_image(docker_image, args) + if validate_code != 0: + xpk_exit(validate_code) + + build_code, docker_image = build_docker_image_from_base_image(args) + if build_code != 0: + xpk_exit(build_code) + + return 0, docker_image From 08a7f3601e0ae5237721d748b6e3cb0a68cf8e4c Mon Sep 17 00:00:00 2001 From: Zheng Chen Date: Tue, 12 Aug 2025 18:34:13 +0000 Subject: [PATCH 3/4] Update cloud prefix list --- src/xpk/core/docker_image.py | 69 ++++-------------------------------- 1 file changed, 7 insertions(+), 62 deletions(-) diff --git a/src/xpk/core/docker_image.py b/src/xpk/core/docker_image.py index edb6ca433..2f52c5211 100644 --- a/src/xpk/core/docker_image.py +++ b/src/xpk/core/docker_image.py @@ -17,6 +17,7 @@ import datetime import os import random +import re import string from ..utils.console import xpk_exit, xpk_print @@ -26,7 +27,11 @@ DEFAULT_DOCKER_IMAGE = 'python:3.10' DEFAULT_SCRIPT_DIR = os.getcwd() PLATFORM = 'linux/amd64' -CLOUD_PREFIXES = ['gcr.io', 'docker.pkg.dev', 'us-docker.pkg.dev'] +CLOUD_PREFIXES = [ + r'^gcr\.io', + r'^docker\.pkg\.dev', + r'^([a-z0-9-]+)-docker\.pkg\.dev', +] def validate_docker_image(docker_image, args) -> int: @@ -151,66 +156,6 @@ def build_docker_image_from_base_image(args, verbose=True) -> tuple[int, str]: return return_code, cloud_docker_image -# def setup_docker_image(args) -> tuple[int, str]: -# """Does steps to verify docker args, check image, and build image (if asked). - -# Args: -# args: user provided arguments for running the command. - -# Returns: -# tuple: -# 0 if successful and 1 otherwise. -# Name of the docker image to use. -# """ -# use_base_docker_image = use_base_docker_image_or_docker_image(args) - -# docker_image = args.base_docker_image -# if use_base_docker_image: -# validate_docker_image_code = validate_docker_image(docker_image, args) -# if validate_docker_image_code != 0: -# xpk_exit(validate_docker_image_code) -# build_docker_image_code, docker_image = build_docker_image_from_base_image( -# args -# ) -# if build_docker_image_code != 0: -# xpk_exit(build_docker_image_code) -# else: -# docker_image = args.docker_image -# validate_docker_image_code = validate_docker_image(args.docker_image, args) -# if validate_docker_image_code != 0: -# xpk_exit(validate_docker_image_code) - -# return 0, docker_image - - -# def use_base_docker_image_or_docker_image(args) -> bool: -# """Checks for correct docker image arguments. - -# Args: -# args: user provided arguments for running the command. - -# Returns: -# True if intended to use base docker image, False to use docker image. -# """ -# use_base_docker_image = True -# # Check if (base_docker_image and script_dir) or (docker_image) is set. -# if args.docker_image is not None: -# if args.script_dir is not DEFAULT_SCRIPT_DIR: -# xpk_print( -# '`--script-dir` and --docker-image can not be used together. Please' -# ' see `--help` command for more details.' -# ) -# xpk_exit(1) -# if args.base_docker_image is not DEFAULT_DOCKER_IMAGE: -# xpk_print( -# '`--base-docker-image` and --docker-image can not be used together.' -# ' Please see `--help` command for more details.' -# ) -# xpk_exit(1) -# use_base_docker_image = False -# return use_base_docker_image - - def setup_docker_image(args) -> tuple[int, str]: """Does steps to verify docker args, check image, and build image (if asked). @@ -235,7 +180,7 @@ def setup_docker_image(args) -> tuple[int, str]: docker_image = DEFAULT_DOCKER_IMAGE is_cloud_image = any( - docker_image.startswith(prefix) for prefix in CLOUD_PREFIXES + re.match(prefix, docker_image) for prefix in CLOUD_PREFIXES ) if is_cloud_image: From 16e76b1d32ee526d6bbbdc79fa1f5d9d6506ca16 Mon Sep 17 00:00:00 2001 From: Zheng Chen Date: Wed, 27 Aug 2025 19:40:17 +0000 Subject: [PATCH 4/4] Update logic based on script_dir to determine if a base_docker_image --- src/xpk/core/docker_image.py | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/xpk/core/docker_image.py b/src/xpk/core/docker_image.py index 2f52c5211..a02ed6828 100644 --- a/src/xpk/core/docker_image.py +++ b/src/xpk/core/docker_image.py @@ -170,6 +170,17 @@ def setup_docker_image(args) -> tuple[int, str]: docker_image = args.docker_image + if ( + docker_image + and args.base_docker_image + and args.base_docker_image is not DEFAULT_DOCKER_IMAGE + ): + xpk_print( + '`--base-docker-image` and --docker-image can not be used together.' + ' Please see `--help` command for more details.' + ) + xpk_exit(1) + if not docker_image and args.base_docker_image: docker_image = args.base_docker_image # fallback for legacy users @@ -183,27 +194,18 @@ def setup_docker_image(args) -> tuple[int, str]: re.match(prefix, docker_image) for prefix in CLOUD_PREFIXES ) - if is_cloud_image: - if args.script_dir is not DEFAULT_SCRIPT_DIR: - xpk_print( - 'Error: `--script-dir` cannot be used with a cloud docker' - ' image.\nHint: If you need to customize the image with local' - ' scripts, use a local base image (e.g., `ubuntu:20.04`) instead of a' - ' prebuilt cloud image.' - ) - xpk_exit(1) - + if ( + args.script_dir and args.script_dir != DEFAULT_SCRIPT_DIR + ) or not is_cloud_image: validate_code = validate_docker_image(docker_image, args) if validate_code != 0: xpk_exit(validate_code) - + build_code, docker_image = build_docker_image_from_base_image(args) + if build_code != 0: + xpk_exit(build_code) else: validate_code = validate_docker_image(docker_image, args) if validate_code != 0: xpk_exit(validate_code) - build_code, docker_image = build_docker_image_from_base_image(args) - if build_code != 0: - xpk_exit(build_code) - return 0, docker_image