Convert Docker containers to bootable VM images. Takes a standard container image (no kernel), extracts the filesystem, and injects the necessary boot components (Kernel, GRUB, Init) to make it bootable on QEMU or bare metal.
sequenceDiagram
autonumber
actor User
participant Script as build.sh
participant Docker as Docker/Podman
participant Disk as Disk Image
participant VM as QEMU/VM
User->>Script: Run ./build.sh alpine:latest
Script->>Docker: Export container filesystem (rootfs.tar)
Script->>Disk: Create & Partition Loop Device
Script->>Disk: Format ext4 & Mount
Script->>Disk: Extract rootfs.tar
Script->>Disk: Install Kernel, GRUB, Init (via chroot)
Script->>User: Output vm.img
User->>VM: Boot vm.img
graph TB
Input([🐳 Container Image])
subgraph Conversion["⚙️ Conversion Pipeline"]
Export["📦 Export Rootfs<br/>(docker export)"]
Partition["💿 Create Disk<br/>(dd + parted)"]
Inject["💉 Inject Boot Components<br/>(Kernel + GRUB + Init)"]
end
subgraph Output["🚀 Bootable VM"]
VM["🖥️ VM Image<br/>(ext4 + MBR)"]
end
Input --> Export
Export --> Partition
Partition --> Inject
Inject --> VM
- Universal Conversion: Works with standard Docker/OCI images.
- Boot Injection: Automatically installs Kernel, GRUB, and Init system.
- Multi-Distro: Supports Alpine (OpenRC) and Debian/Ubuntu (systemd).
- Zero Magic: Pure Bash script using standard Linux tools (
losetup,parted,chroot).
container2image/
├── build.sh # Main orchestration script
├── Makefile # Build automation
├── docs/GUIDE.md # Comprehensive guide
└── examples/ # Example configurations
Linux host with docker, parted, mkfs.ext4, grub-install.
# 1. Clone
git clone https://github.com/digsh0t/container2image.git
cd container2image
# 2. Build (Alpine example)
sudo ./build.sh alpine:latest
# 3. Boot (QEMU)
qemu-system-x86_64 -hda vm.img -m 512M| Distro | Init System | Status |
|---|---|---|
| Alpine | OpenRC | ✅ Stable |
| Debian | systemd | ✅ Stable |
| Ubuntu | systemd | ✅ Stable |
| Others | Manual |
| Issue | Solution |
|---|---|
| Black Screen | Add console=tty0 to kernel params. |
| Network Fail | Script auto-copies /etc/resolv.conf. |
| macOS | Use UTM, OrbStack, or Docker --privileged. |
MIT