Skip to content

digsh0t/container2image

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Container2VM

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.

⚙️ How It Works

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
Loading

📊 Architecture

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
Loading

Features

  • 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).

Structure

container2image/
├── build.sh          # Main orchestration script
├── Makefile          # Build automation
├── docs/GUIDE.md     # Comprehensive guide
└── examples/         # Example configurations

Quick Start

Prerequisites

Linux host with docker, parted, mkfs.ext4, grub-install.

Build & Boot

# 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

Supported Distributions

Distro Init System Status
Alpine OpenRC ✅ Stable
Debian systemd ✅ Stable
Ubuntu systemd ✅ Stable
Others Manual ⚠️ Experimental

Troubleshooting

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.

License

MIT

About

A script to export a VM image from a Docker container

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published