Skip to content

Hybrid Build Strategy: Manual BuildKit + Kaniko Pipeline #5

@kingdonb

Description

@kingdonb

Hybrid Build Strategy: Manual BuildKit + Kaniko Pipeline Integration

Problem Statement

Kaniko cannot build images that use advanced BuildKit features like RUN --mount=from=. This includes Kaniko itself, which uses these features in its Dockerfile. Attempting to bootstrap Kaniko with Kaniko hits this fundamental limitation.

Root Cause Analysis

# From Kaniko's deploy/Dockerfile - incompatible with Kaniko executor
FROM scratch AS kaniko-base-slim
RUN --mount=from=busybox,dst=/usr/ ["busybox", "sh", "-c", "mkdir -p /kaniko && chmod 777 /kaniko"]

Kaniko does not support:

  • RUN --mount=from=<image>
  • RUN --mount=type=cache
  • Other advanced BuildKit syntax

Solution: Hybrid Approach ✅

Phase 1: Manual Build Mode (IMPLEMENTED)

New build-config.yaml capability:

# For BuildKit-incompatible images
manual_build: true
manual_images:
  amd64: "<ECR-REGISTRY>/kaniko/executor:v1.25.3-debug-amd64"
  arm64: "<ECR-REGISTRY>/kaniko/executor:v1.25.3-debug-arm64"

Pipeline behavior:

  • Detects manual_build: true
  • Skips Kaniko build entirely
  • Uses pre-built images for manifest creation
  • Maintains full pipeline integration

Phase 2: Manual Build Process (DOCUMENTED)

Created MANUAL_BUILD_PROCESS.md with:

  • Step-by-step BuildKit build instructions
  • Multi-architecture build commands
  • ECR integration and authentication
  • Pipeline configuration updates
  • Verification and troubleshooting

Implementation Details

Files Modified

  • kaniko/build-config.yaml - Added manual build configuration
  • .gitlab-ci.yml - Added manual build detection and handling
  • MANUAL_BUILD_PROCESS.md - Complete manual build documentation

Pipeline Logic

# New pipeline logic
if [ "$MANUAL_BUILD" = "true" ]; then
  echo "🔧 Manual build mode detected"
  MANUAL_IMAGE=$(get_manual_image_for_arch)
  echo "$MANUAL_TAG" > "${dir}-${ARCH}.tag"
  # Skip to manifest creation
fi

Benefits

Immediate Value

  • Unblocks Kaniko builds: Can now build Kaniko using hybrid approach
  • Maintains automation: Still uses pipeline for manifest creation
  • Clean integration: No special cases in main pipeline logic
  • Reproducible process: Documented manual build steps

Future Flexibility

  • 🔧 BuildKit migration path: Easy transition when ready
  • 🔧 Selective adoption: Choose best tool per image
  • 🔧 Dev container integration: Can pre-configure build environment

Next Steps

  1. Execute manual Kaniko build using documented process
  2. Update kaniko/build-config.yaml with actual image tags
  3. Test pipeline integration with manual mode
  4. Validate multi-arch manifest creation
  5. Adopt self-built Kaniko for pipeline

Success Criteria

  • ✅ Multi-arch Kaniko images built manually with BuildKit
  • ✅ Pipeline creates multi-arch manifests from manual images
  • ✅ Clean tags: <ECR-REGISTRY>/kaniko/executor:debug
  • ✅ Self-hosting: Use our Kaniko instead of upstream

Impact

This hybrid approach solves the bootstrapping problem while maintaining the benefits of both Kaniko (simple, secure) and BuildKit (feature-complete) depending on image requirements.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions