A bash wrapper for Titanoboa and Bootc-image-builder that provides a unified interface for building bootable images from container images.
- ๐ Unified Interface: Single command for multiple build tools
- ๐๏ธ Multiple Build Types: Support for ISO, Live ISO, QCOW2, and Raw disk images
- ๐๏ธ Architecture Support: Build for x86_64 and aarch64 architectures
- ๐จ Colored Output: Clear, colorful terminal output for better UX
- โ๏ธ Smart Tool Selection: Automatically chooses the right tool for each build type
- ๐ก๏ธ Error Handling: Comprehensive validation and error reporting
# Clone the repository
git clone https://github.com/tuna-os/bootc-builder.git
cd bootc-builder
# Install to /usr/local/bin (requires sudo)
sudo ./install.sh
# Or install to a custom location
./install.sh --install-dir ~/.local/bin# Make executable and copy to your PATH
chmod +x bootc-builder
sudo cp bootc-builder /usr/local/bin/bootc-builder build <IMAGE_URI> --type <TYPE> [OPTIONS]-
--type <TYPE>: Build type (required)iso: Anaconda installer ISO (uses bootc-image-builder)live-iso: Live ISO that boots directly to the OS (uses Titanoboa)qcow2: QEMU disk image (uses bootc-image-builder)raw: Raw disk image (uses bootc-image-builder)
-
--arch <ARCH>: Target architecture (default: x86_64)x86_64: Intel/AMD 64-bitaarch64: ARM 64-bit
-
--output-dir <DIR>: Output directory (default: current directory) -
--verbose: Enable verbose output -
--help: Show help message
# Create an Anaconda ISO for installation
bootc-builder build ghcr.io/ublue-os/bluefin:latest --type iso --output-dir /tmp
# Create a live ISO that boots directly
bootc-builder build ghcr.io/ublue-os/bluefin:latest --type live-iso --output-dir /tmp
# Create a QEMU disk image
bootc-builder build ghcr.io/ublue-os/bluefin:latest --type qcow2 --output-dir /tmp# Build for ARM64 architecture
bootc-builder build ghcr.io/ublue-os/bluefin:latest --type iso --arch aarch64 --output-dir /tmp
# Enable verbose output for debugging
bootc-builder build ghcr.io/ublue-os/bluefin:latest --type qcow2 --verbose --output-dir /tmp
# Build from specific tag
bootc-builder build ghcr.io/ublue-os/bluefin:40 --type live-iso --output-dir ./builds| Type | Tool | Description | Use Case |
|---|---|---|---|
iso |
bootc-image-builder | Anaconda installer ISO | Traditional installation media |
live-iso |
Titanoboa | Live bootable ISO | Try before install, rescue disks |
qcow2 |
bootc-image-builder | QEMU virtual disk | Virtual machines |
raw |
bootc-image-builder | Raw disk image | Physical deployment, cloud images |
- podman
- just (command runner)
bootc-builder has different dependencies based on the build type:
- All builds:
podman- Container runtime for pulling and managing images - Live ISO builds:
just- Command runner for executing Titanoboa builds
podman:
- Fedora/RHEL:
sudo dnf install podman - Ubuntu/Debian:
sudo apt install podman - Arch:
sudo pacman -S podman - macOS:
brew install podman
just:
- Fedora:
sudo dnf install just - Ubuntu/Debian:
cargo install just(requires Rust) or download from releases - Arch:
sudo pacman -S just - macOS:
brew install just
bootc-builder acts as a unified interface that:
- Validates input parameters (image URI, build type, architecture, etc.)
- Selects the appropriate tool:
- Uses Titanoboa (native) for
live-isobuilds via git submodule - Uses bootc-image-builder (containerized) for
iso,qcow2, andrawbuilds
- Uses Titanoboa (native) for
- Generates configuration files as needed for each tool
- Executes the build using the appropriate method for each tool
- Handles cleanup and provides user feedback
For live ISO builds, bootc-builder uses Titanoboa as a git submodule. This allows us to:
- Call Titanoboa natively without containerization
- Benefit from the latest Titanoboa features and fixes
- Avoid the complexity of nested podman required for a containerized approach
The submodule is automatically initialized during installation.
# Initialize git submodules
git submodule update --init --recursive
# Make scripts executable
make dev
# Run tests
make test
# Lint shell scripts (requires shellcheck)
make lint
# Clean up temporary files
make clean- Fork the repository
- Create a feature branch:
git checkout -b feature-name - Make your changes
- Run tests:
make test - Commit your changes:
git commit -am 'Add some feature' - Push to the branch:
git push origin feature-name - Submit a pull request
"podman: command not found"
- Install podman on your system (see Dependencies section above)
"just: command not found"
- Install just command runner (see Dependencies section above)
- Only required for live-iso builds
"Titanoboa directory not found"
- Initialize git submodules:
git submodule update --init --recursive
Permission denied when running
- Make sure the script is executable:
chmod +x bootc-builder - For system installation, use sudo:
sudo ./install.sh
Build fails with container errors
- Ensure podman is running and accessible
- Try running with
--verbosefor more detailed output - Check that the container image URI is correct and accessible
- Run
bootc-builder --helpfor usage information - Check the Issues page
- Review the examples in this README
This project is licensed under the Apache License 2.0 - see the LICENSE file for details. A bash+glow wrapper for Titanoboa and Bootc-image-builder
bootc-builder image --type {iso,live-iso,qcow2,raw} --arch {x86_64,aarch64} --output-dir /path/to/outputbootc-builder ghcr.io/ublue-os/bluefin:latest --type iso --arch x86_64 --output-dir /tmp # uses Bootc-image-builder to create an non-live Anaconda ISO from the Bootc image
bootc-builder ghcr.io/ublue-os/bluefin:lts --type live-iso --arch aarch64 --output-dir /tmp # uses Titanoboa to create a live ISO from the Bootc image- podman