@@ -59,6 +59,10 @@ class AwsBatchConfig:
5959 max_cache_age_days : int = 30 # Clean up cache layers older than this
6060 max_cache_size_gb : int = 400 # Maximum total cache size
6161
62+ # Buildx configuration
63+ use_buildx : bool = True # Use docker buildx for advanced caching and multi-platform builds
64+ buildx_builder_name : str = "aws-builder" # Name for the buildx builder instance
65+
6266
6367@dataclass
6468class BatchTask :
@@ -442,21 +446,63 @@ def _generate_user_data(self, batch_data_key: str) -> str:
442446 BUILD_START=$(date +%s.%N)
443447 BUILD_LOG_FILE="build.log"
444448
445- # Build Docker command with S3 cache support
446- DOCKER_BUILD_CMD="timeout $BATCH_TIMEOUT docker build -t $IMAGE_NAME . --build-arg REPO_URL=$REPO_URL --build-arg COMMIT_SHA=$SHA --build-arg ENV_PAYLOAD=\" $ENV_PAYLOAD\" --target $TAG"
449+ # Check if we should use buildx
450+ USE_BUILDX="{use_buildx}"
451+ BUILDER_NAME="{buildx_builder_name}"
452+
453+ if [ "$USE_BUILDX" = "true" ]; then
454+ echo "Setting up docker buildx builder: $BUILDER_NAME"
455+
456+ # Create buildx builder if it doesn't exist
457+ if ! docker buildx ls | grep -q "$BUILDER_NAME"; then
458+ echo "Creating buildx builder: $BUILDER_NAME"
459+ docker buildx create --name "$BUILDER_NAME" --use --driver docker-container || {
460+ echo "Failed to create buildx builder, falling back to default"
461+ docker buildx use default
462+ }
463+ else
464+ echo "Using existing buildx builder: $BUILDER_NAME"
465+ docker buildx use "$BUILDER_NAME"
466+ fi
467+
468+ # Build Docker command with buildx and S3 cache support
469+ DOCKER_BUILD_CMD="timeout $BATCH_TIMEOUT docker buildx build --load --progress=plain -t $IMAGE_NAME . --build-arg REPO_URL=$REPO_URL --build-arg COMMIT_SHA=$SHA --build-arg ENV_PAYLOAD=\" $ENV_PAYLOAD\" --target $TAG"
470+
471+ # Add S3 cache arguments if cache is enabled
472+ if [ "{enable_s3_cache}" = "true" ]; then
473+ CACHE_BUCKET="{cache_bucket}"
474+ CACHE_PREFIX="{cache_prefix}"
475+ CACHE_REGION="{cache_region}"
447476
448- # Add S3 cache arguments if cache is enabled
449- if [ "{enable_s3_cache}" = "true" ]; then
450- CACHE_BUCKET="{cache_bucket}"
451- CACHE_PREFIX="{cache_prefix}"
452- CACHE_REGION="{cache_region}"
477+ # Generate cache mount configuration for buildx
478+ CACHE_FROM="type=s3,bucket=$CACHE_BUCKET,region=$CACHE_REGION,prefix=$CACHE_PREFIX/layers/$OWNER-$REPO-$SHA"
479+ CACHE_TO="type=s3,bucket=$CACHE_BUCKET,region=$CACHE_REGION,prefix=$CACHE_PREFIX/layers/$OWNER-$REPO-$SHA,mode=max"
453480
454- # Generate cache mount configuration
455- CACHE_MOUNT="type=s3,bucket=$CACHE_BUCKET,region=$CACHE_REGION,prefix=$CACHE_PREFIX/layers/$OWNER-$REPO-$SHA"
481+ DOCKER_BUILD_CMD="$DOCKER_BUILD_CMD --cache-from $CACHE_FROM --cache-to $CACHE_TO"
456482
457- DOCKER_BUILD_CMD="$DOCKER_BUILD_CMD --cache-from $CACHE_MOUNT --cache-to $CACHE_MOUNT,mode=max"
483+ echo "Using buildx with S3 cache: bucket=$CACHE_BUCKET, prefix=$CACHE_PREFIX"
484+ else
485+ echo "Using buildx without S3 cache"
486+ fi
487+ else
488+ echo "Using standard docker build"
489+
490+ # Build Docker command with S3 cache support (legacy)
491+ DOCKER_BUILD_CMD="timeout $BATCH_TIMEOUT docker build -t $IMAGE_NAME . --build-arg REPO_URL=$REPO_URL --build-arg COMMIT_SHA=$SHA --build-arg ENV_PAYLOAD=\" $ENV_PAYLOAD\" --target $TAG"
492+
493+ # Add S3 cache arguments if cache is enabled
494+ if [ "{enable_s3_cache}" = "true" ]; then
495+ CACHE_BUCKET="{cache_bucket}"
496+ CACHE_PREFIX="{cache_prefix}"
497+ CACHE_REGION="{cache_region}"
458498
459- echo "Using S3 cache: bucket=$CACHE_BUCKET, prefix=$CACHE_PREFIX"
499+ # Generate cache mount configuration
500+ CACHE_MOUNT="type=s3,bucket=$CACHE_BUCKET,region=$CACHE_REGION,prefix=$CACHE_PREFIX/layers/$OWNER-$REPO-$SHA"
501+
502+ DOCKER_BUILD_CMD="$DOCKER_BUILD_CMD --cache-from $CACHE_MOUNT --cache-to $CACHE_MOUNT,mode=max"
503+
504+ echo "Using S3 cache: bucket=$CACHE_BUCKET, prefix=$CACHE_PREFIX"
505+ fi
460506 fi
461507
462508 if $DOCKER_BUILD_CMD > "$BUILD_LOG_FILE" 2>&1; then
@@ -619,6 +665,8 @@ def _generate_user_data(self, batch_data_key: str) -> str:
619665 .replace ("{cache_bucket}" , self .cfg .cache_bucket or "" )
620666 .replace ("{cache_prefix}" , self .cfg .cache_prefix )
621667 .replace ("{cache_region}" , self .cfg .cache_region or self .cfg .region )
668+ .replace ("{use_buildx}" , str (self .cfg .use_buildx ).lower ())
669+ .replace ("{buildx_builder_name}" , self .cfg .buildx_builder_name )
622670 )
623671
624672 def _stream_user_data_logs (self , instance_id : str , batch_idx : int , run_id : str , last_position : int = 0 ) -> int :
0 commit comments