mirror of
https://github.com/johndoe6345789/SparkOS.git
synced 2026-04-24 13:34:56 +00:00
Merge pull request #21 from johndoe6345789/copilot/extract-docker-file-commands
Extract Docker RUN commands into shell scripts
This commit is contained in:
31
Dockerfile
31
Dockerfile
@@ -20,40 +20,21 @@ FROM alpine:3.19
|
|||||||
|
|
||||||
# Install file command for testing init binary
|
# Install file command for testing init binary
|
||||||
# file package provides the file(1) command to determine file type
|
# file package provides the file(1) command to determine file type
|
||||||
RUN apk add --no-cache file
|
COPY scripts/docker-install-packages.sh /tmp/
|
||||||
|
RUN /tmp/docker-install-packages.sh
|
||||||
|
|
||||||
# Note: Alpine includes busybox by default
|
# Note: Alpine includes busybox by default
|
||||||
|
|
||||||
# Create minimal rootfs structure
|
# Create minimal rootfs structure
|
||||||
RUN mkdir -p /sparkos/rootfs/bin \
|
COPY scripts/docker-setup-rootfs.sh /tmp/
|
||||||
/sparkos/rootfs/sbin \
|
RUN /tmp/docker-setup-rootfs.sh
|
||||||
/sparkos/rootfs/etc \
|
|
||||||
/sparkos/rootfs/proc \
|
|
||||||
/sparkos/rootfs/sys \
|
|
||||||
/sparkos/rootfs/dev \
|
|
||||||
/sparkos/rootfs/tmp \
|
|
||||||
/sparkos/rootfs/usr/bin \
|
|
||||||
/sparkos/rootfs/usr/sbin \
|
|
||||||
/sparkos/rootfs/usr/lib \
|
|
||||||
/sparkos/rootfs/var/log \
|
|
||||||
/sparkos/rootfs/var/run \
|
|
||||||
/sparkos/rootfs/root \
|
|
||||||
/sparkos/rootfs/home/spark && \
|
|
||||||
chmod 1777 /sparkos/rootfs/tmp && \
|
|
||||||
chmod 700 /sparkos/rootfs/root && \
|
|
||||||
chmod 755 /sparkos/rootfs/home/spark
|
|
||||||
|
|
||||||
# Copy built init binary from builder
|
# Copy built init binary from builder
|
||||||
COPY --from=builder /build/init /sparkos/rootfs/sbin/init
|
COPY --from=builder /build/init /sparkos/rootfs/sbin/init
|
||||||
|
|
||||||
# Set up basic configuration files
|
# Set up basic configuration files
|
||||||
RUN echo "sparkos" > /sparkos/rootfs/etc/hostname && \
|
COPY scripts/docker-setup-config.sh /tmp/
|
||||||
echo "127.0.0.1 localhost" > /sparkos/rootfs/etc/hosts && \
|
RUN /tmp/docker-setup-config.sh
|
||||||
echo "127.0.1.1 sparkos" >> /sparkos/rootfs/etc/hosts && \
|
|
||||||
echo "root:x:0:0:root:/root:/bin/sh" > /sparkos/rootfs/etc/passwd && \
|
|
||||||
echo "spark:x:1000:1000:SparkOS User:/home/spark:/bin/sh" >> /sparkos/rootfs/etc/passwd && \
|
|
||||||
echo "root:x:0:" > /sparkos/rootfs/etc/group && \
|
|
||||||
echo "spark:x:1000:" >> /sparkos/rootfs/etc/group
|
|
||||||
|
|
||||||
# Create a test entrypoint
|
# Create a test entrypoint
|
||||||
COPY scripts/test.sh /sparkos/test.sh
|
COPY scripts/test.sh /sparkos/test.sh
|
||||||
|
|||||||
138
Dockerfile.image
138
Dockerfile.image
@@ -4,21 +4,8 @@
|
|||||||
FROM ubuntu:22.04 AS image-builder
|
FROM ubuntu:22.04 AS image-builder
|
||||||
|
|
||||||
# Install required tools
|
# Install required tools
|
||||||
RUN apt-get update && \
|
COPY scripts/docker-image-install-tools.sh /tmp/
|
||||||
apt-get install -y \
|
RUN /tmp/docker-image-install-tools.sh
|
||||||
gcc \
|
|
||||||
make \
|
|
||||||
dosfstools \
|
|
||||||
mtools \
|
|
||||||
e2fsprogs \
|
|
||||||
parted \
|
|
||||||
gdisk \
|
|
||||||
grub-efi-amd64-bin \
|
|
||||||
grub-common \
|
|
||||||
wget \
|
|
||||||
busybox-static \
|
|
||||||
kmod \
|
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
WORKDIR /build
|
WORKDIR /build
|
||||||
|
|
||||||
@@ -33,125 +20,12 @@ COPY rootfs/ ./rootfs/
|
|||||||
RUN make init
|
RUN make init
|
||||||
|
|
||||||
# Download a minimal Linux kernel (using Ubuntu's kernel for now)
|
# Download a minimal Linux kernel (using Ubuntu's kernel for now)
|
||||||
RUN mkdir -p /kernel && \
|
COPY scripts/docker-image-download-kernel.sh /tmp/
|
||||||
apt-get update && \
|
RUN /tmp/docker-image-download-kernel.sh
|
||||||
apt-get download linux-image-generic && \
|
|
||||||
dpkg -x linux-image-*.deb /kernel && \
|
|
||||||
rm -rf /var/lib/apt/lists/* linux-image-*.deb
|
|
||||||
|
|
||||||
# Create UEFI-bootable image with GPT partition table
|
# Create UEFI-bootable image with GPT partition table
|
||||||
RUN mkdir -p /output /mnt/esp /mnt/root && \
|
COPY scripts/docker-image-create-uefi.sh /tmp/
|
||||||
echo "=== Creating UEFI-bootable SparkOS image with GRUB ===" && \
|
RUN /tmp/docker-image-create-uefi.sh
|
||||||
# Create 1GB disk image (larger for kernel + bootloader)
|
|
||||||
dd if=/dev/zero of=/output/sparkos.img bs=1M count=1024 && \
|
|
||||||
\
|
|
||||||
# Create GPT partition table
|
|
||||||
echo "Creating GPT partition table..." && \
|
|
||||||
parted -s /output/sparkos.img mklabel gpt && \
|
|
||||||
\
|
|
||||||
# Create EFI System Partition (ESP) - 200MB, FAT32
|
|
||||||
echo "Creating EFI System Partition..." && \
|
|
||||||
parted -s /output/sparkos.img mkpart ESP fat32 1MiB 201MiB && \
|
|
||||||
parted -s /output/sparkos.img set 1 esp on && \
|
|
||||||
\
|
|
||||||
# Create root partition - remaining space, ext4
|
|
||||||
echo "Creating root partition..." && \
|
|
||||||
parted -s /output/sparkos.img mkpart primary ext4 201MiB 100% && \
|
|
||||||
\
|
|
||||||
# Set up loop device for the image
|
|
||||||
LOOP_DEV=$(losetup -f) && \
|
|
||||||
losetup -P $LOOP_DEV /output/sparkos.img && \
|
|
||||||
\
|
|
||||||
# Wait for partition devices
|
|
||||||
sleep 1 && \
|
|
||||||
\
|
|
||||||
# Format partitions
|
|
||||||
echo "Formatting EFI System Partition (FAT32)..." && \
|
|
||||||
mkfs.vfat -F 32 -n "SPARKOSEFI" ${LOOP_DEV}p1 && \
|
|
||||||
\
|
|
||||||
echo "Formatting root partition (ext4)..." && \
|
|
||||||
mkfs.ext4 -L "SparkOS" ${LOOP_DEV}p2 && \
|
|
||||||
\
|
|
||||||
# Mount ESP
|
|
||||||
echo "Mounting partitions..." && \
|
|
||||||
mount ${LOOP_DEV}p1 /mnt/esp && \
|
|
||||||
mount ${LOOP_DEV}p2 /mnt/root && \
|
|
||||||
\
|
|
||||||
# Install GRUB to ESP
|
|
||||||
echo "Installing GRUB bootloader..." && \
|
|
||||||
mkdir -p /mnt/esp/EFI/BOOT && \
|
|
||||||
\
|
|
||||||
# Create GRUB EFI binary using grub-mkstandalone
|
|
||||||
grub-mkstandalone \
|
|
||||||
--format=x86_64-efi \
|
|
||||||
--output=/mnt/esp/EFI/BOOT/BOOTX64.EFI \
|
|
||||||
--locales="" \
|
|
||||||
--fonts="" \
|
|
||||||
"boot/grub/grub.cfg=/dev/null" && \
|
|
||||||
\
|
|
||||||
# Find the kernel
|
|
||||||
KERNEL_PATH=$(find /kernel/boot -name "vmlinuz-*" | head -1) && \
|
|
||||||
KERNEL_VERSION=$(basename $KERNEL_PATH | sed 's/vmlinuz-//') && \
|
|
||||||
INITRD_PATH=$(find /kernel/boot -name "initrd.img-*" | head -1) && \
|
|
||||||
\
|
|
||||||
# Copy kernel and initrd to ESP
|
|
||||||
echo "Installing kernel..." && \
|
|
||||||
mkdir -p /mnt/esp/boot && \
|
|
||||||
cp $KERNEL_PATH /mnt/esp/boot/vmlinuz && \
|
|
||||||
if [ -f "$INITRD_PATH" ]; then cp $INITRD_PATH /mnt/esp/boot/initrd.img; fi && \
|
|
||||||
\
|
|
||||||
# Create GRUB configuration
|
|
||||||
mkdir -p /mnt/esp/boot/grub && \
|
|
||||||
printf '%s\n' \
|
|
||||||
'set timeout=3' \
|
|
||||||
'set default=0' \
|
|
||||||
'' \
|
|
||||||
'menuentry "SparkOS" {' \
|
|
||||||
' linux /boot/vmlinuz root=LABEL=SparkOS rw init=/sbin/init console=tty1 quiet' \
|
|
||||||
'}' \
|
|
||||||
> /mnt/esp/boot/grub/grub.cfg && \
|
|
||||||
\
|
|
||||||
# Set up root filesystem
|
|
||||||
echo "Setting up root filesystem..." && \
|
|
||||||
mkdir -p /mnt/root/{bin,sbin,etc,proc,sys,dev,tmp,usr/{bin,sbin,lib,lib64},var/{log,run},root,home/spark,boot} && \
|
|
||||||
\
|
|
||||||
# Install SparkOS init
|
|
||||||
cp /build/init /mnt/root/sbin/init && \
|
|
||||||
chmod 755 /mnt/root/sbin/init && \
|
|
||||||
\
|
|
||||||
# Install busybox
|
|
||||||
echo "Installing busybox..." && \
|
|
||||||
cp /bin/busybox /mnt/root/bin/busybox && \
|
|
||||||
chmod 755 /mnt/root/bin/busybox && \
|
|
||||||
\
|
|
||||||
# Create busybox symlinks for essential commands
|
|
||||||
for cmd in sh ls cat echo mount umount mkdir rm cp mv chmod chown ln ps kill; do \
|
|
||||||
ln -sf busybox /mnt/root/bin/$cmd; \
|
|
||||||
done && \
|
|
||||||
\
|
|
||||||
# Create system configuration files
|
|
||||||
echo "sparkos" > /mnt/root/etc/hostname && \
|
|
||||||
echo "127.0.0.1 localhost" > /mnt/root/etc/hosts && \
|
|
||||||
echo "127.0.1.1 sparkos" >> /mnt/root/etc/hosts && \
|
|
||||||
echo "root:x:0:0:root:/root:/bin/sh" > /mnt/root/etc/passwd && \
|
|
||||||
echo "spark:x:1000:1000:SparkOS User:/home/spark:/bin/sh" >> /mnt/root/etc/passwd && \
|
|
||||||
echo "root:x:0:" > /mnt/root/etc/group && \
|
|
||||||
echo "spark:x:1000:" >> /mnt/root/etc/group && \
|
|
||||||
\
|
|
||||||
# Copy README to root partition
|
|
||||||
cp /build/config/image-readme.txt /mnt/root/README.txt && \
|
|
||||||
\
|
|
||||||
# Sync and unmount
|
|
||||||
echo "Finalizing image..." && \
|
|
||||||
sync && \
|
|
||||||
umount /mnt/esp && \
|
|
||||||
umount /mnt/root && \
|
|
||||||
losetup -d $LOOP_DEV && \
|
|
||||||
\
|
|
||||||
# Compress the image
|
|
||||||
echo "Compressing image..." && \
|
|
||||||
gzip -9 /output/sparkos.img && \
|
|
||||||
echo "UEFI-bootable image created: /output/sparkos.img.gz"
|
|
||||||
|
|
||||||
# Final stage - export the image
|
# Final stage - export the image
|
||||||
FROM scratch AS export
|
FROM scratch AS export
|
||||||
|
|||||||
119
scripts/docker-image-create-uefi.sh
Executable file
119
scripts/docker-image-create-uefi.sh
Executable file
@@ -0,0 +1,119 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Create UEFI-bootable SparkOS image with GPT partition table
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
mkdir -p /output /mnt/esp /mnt/root
|
||||||
|
|
||||||
|
echo "=== Creating UEFI-bootable SparkOS image with GRUB ==="
|
||||||
|
|
||||||
|
# Create 1GB disk image (larger for kernel + bootloader)
|
||||||
|
dd if=/dev/zero of=/output/sparkos.img bs=1M count=1024
|
||||||
|
|
||||||
|
# Create GPT partition table
|
||||||
|
echo "Creating GPT partition table..."
|
||||||
|
parted -s /output/sparkos.img mklabel gpt
|
||||||
|
|
||||||
|
# Create EFI System Partition (ESP) - 200MB, FAT32
|
||||||
|
echo "Creating EFI System Partition..."
|
||||||
|
parted -s /output/sparkos.img mkpart ESP fat32 1MiB 201MiB
|
||||||
|
parted -s /output/sparkos.img set 1 esp on
|
||||||
|
|
||||||
|
# Create root partition - remaining space, ext4
|
||||||
|
echo "Creating root partition..."
|
||||||
|
parted -s /output/sparkos.img mkpart primary ext4 201MiB 100%
|
||||||
|
|
||||||
|
# Set up loop device for the image
|
||||||
|
LOOP_DEV=$(losetup -f)
|
||||||
|
losetup -P $LOOP_DEV /output/sparkos.img
|
||||||
|
|
||||||
|
# Wait for partition devices
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
# Format partitions
|
||||||
|
echo "Formatting EFI System Partition (FAT32)..."
|
||||||
|
mkfs.vfat -F 32 -n "SPARKOSEFI" ${LOOP_DEV}p1
|
||||||
|
|
||||||
|
echo "Formatting root partition (ext4)..."
|
||||||
|
mkfs.ext4 -L "SparkOS" ${LOOP_DEV}p2
|
||||||
|
|
||||||
|
# Mount ESP
|
||||||
|
echo "Mounting partitions..."
|
||||||
|
mount ${LOOP_DEV}p1 /mnt/esp
|
||||||
|
mount ${LOOP_DEV}p2 /mnt/root
|
||||||
|
|
||||||
|
# Install GRUB to ESP
|
||||||
|
echo "Installing GRUB bootloader..."
|
||||||
|
mkdir -p /mnt/esp/EFI/BOOT
|
||||||
|
|
||||||
|
# Create GRUB EFI binary using grub-mkstandalone
|
||||||
|
grub-mkstandalone \
|
||||||
|
--format=x86_64-efi \
|
||||||
|
--output=/mnt/esp/EFI/BOOT/BOOTX64.EFI \
|
||||||
|
--locales="" \
|
||||||
|
--fonts="" \
|
||||||
|
"boot/grub/grub.cfg=/dev/null"
|
||||||
|
|
||||||
|
# Find the kernel
|
||||||
|
KERNEL_PATH=$(find /kernel/boot -name "vmlinuz-*" | head -1)
|
||||||
|
KERNEL_VERSION=$(basename $KERNEL_PATH | sed 's/vmlinuz-//')
|
||||||
|
INITRD_PATH=$(find /kernel/boot -name "initrd.img-*" | head -1)
|
||||||
|
|
||||||
|
# Copy kernel and initrd to ESP
|
||||||
|
echo "Installing kernel..."
|
||||||
|
mkdir -p /mnt/esp/boot
|
||||||
|
cp $KERNEL_PATH /mnt/esp/boot/vmlinuz
|
||||||
|
if [ -f "$INITRD_PATH" ]; then cp $INITRD_PATH /mnt/esp/boot/initrd.img; fi
|
||||||
|
|
||||||
|
# Create GRUB configuration
|
||||||
|
mkdir -p /mnt/esp/boot/grub
|
||||||
|
printf '%s\n' \
|
||||||
|
'set timeout=3' \
|
||||||
|
'set default=0' \
|
||||||
|
'' \
|
||||||
|
'menuentry "SparkOS" {' \
|
||||||
|
' linux /boot/vmlinuz root=LABEL=SparkOS rw init=/sbin/init console=tty1 quiet' \
|
||||||
|
'}' \
|
||||||
|
> /mnt/esp/boot/grub/grub.cfg
|
||||||
|
|
||||||
|
# Set up root filesystem
|
||||||
|
echo "Setting up root filesystem..."
|
||||||
|
mkdir -p /mnt/root/{bin,sbin,etc,proc,sys,dev,tmp,usr/{bin,sbin,lib,lib64},var/{log,run},root,home/spark,boot}
|
||||||
|
|
||||||
|
# Install SparkOS init
|
||||||
|
cp /build/init /mnt/root/sbin/init
|
||||||
|
chmod 755 /mnt/root/sbin/init
|
||||||
|
|
||||||
|
# Install busybox
|
||||||
|
echo "Installing busybox..."
|
||||||
|
cp /bin/busybox /mnt/root/bin/busybox
|
||||||
|
chmod 755 /mnt/root/bin/busybox
|
||||||
|
|
||||||
|
# Create busybox symlinks for essential commands
|
||||||
|
for cmd in sh ls cat echo mount umount mkdir rm cp mv chmod chown ln ps kill; do
|
||||||
|
ln -sf busybox /mnt/root/bin/$cmd
|
||||||
|
done
|
||||||
|
|
||||||
|
# Create system configuration files
|
||||||
|
echo "sparkos" > /mnt/root/etc/hostname
|
||||||
|
echo "127.0.0.1 localhost" > /mnt/root/etc/hosts
|
||||||
|
echo "127.0.1.1 sparkos" >> /mnt/root/etc/hosts
|
||||||
|
echo "root:x:0:0:root:/root:/bin/sh" > /mnt/root/etc/passwd
|
||||||
|
echo "spark:x:1000:1000:SparkOS User:/home/spark:/bin/sh" >> /mnt/root/etc/passwd
|
||||||
|
echo "root:x:0:" > /mnt/root/etc/group
|
||||||
|
echo "spark:x:1000:" >> /mnt/root/etc/group
|
||||||
|
|
||||||
|
# Copy README to root partition
|
||||||
|
cp /build/config/image-readme.txt /mnt/root/README.txt
|
||||||
|
|
||||||
|
# Sync and unmount
|
||||||
|
echo "Finalizing image..."
|
||||||
|
sync
|
||||||
|
umount /mnt/esp
|
||||||
|
umount /mnt/root
|
||||||
|
losetup -d $LOOP_DEV
|
||||||
|
|
||||||
|
# Compress the image
|
||||||
|
echo "Compressing image..."
|
||||||
|
gzip -9 /output/sparkos.img
|
||||||
|
echo "UEFI-bootable image created: /output/sparkos.img.gz"
|
||||||
10
scripts/docker-image-download-kernel.sh
Executable file
10
scripts/docker-image-download-kernel.sh
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Download a minimal Linux kernel for UEFI image
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
mkdir -p /kernel
|
||||||
|
apt-get update
|
||||||
|
apt-get download linux-image-generic
|
||||||
|
dpkg -x linux-image-*.deb /kernel
|
||||||
|
rm -rf /var/lib/apt/lists/* linux-image-*.deb
|
||||||
20
scripts/docker-image-install-tools.sh
Executable file
20
scripts/docker-image-install-tools.sh
Executable file
@@ -0,0 +1,20 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Install required tools for building UEFI-bootable SparkOS image
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
apt-get update
|
||||||
|
apt-get install -y \
|
||||||
|
gcc \
|
||||||
|
make \
|
||||||
|
dosfstools \
|
||||||
|
mtools \
|
||||||
|
e2fsprogs \
|
||||||
|
parted \
|
||||||
|
gdisk \
|
||||||
|
grub-efi-amd64-bin \
|
||||||
|
grub-common \
|
||||||
|
wget \
|
||||||
|
busybox-static \
|
||||||
|
kmod
|
||||||
|
rm -rf /var/lib/apt/lists/*
|
||||||
6
scripts/docker-install-packages.sh
Executable file
6
scripts/docker-install-packages.sh
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Install runtime packages for Alpine-based Docker image
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
apk add --no-cache file
|
||||||
19
scripts/docker-setup-config.sh
Executable file
19
scripts/docker-setup-config.sh
Executable file
@@ -0,0 +1,19 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Set up basic configuration files for SparkOS
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Create hostname
|
||||||
|
echo "sparkos" > /sparkos/rootfs/etc/hostname
|
||||||
|
|
||||||
|
# Create hosts file
|
||||||
|
echo "127.0.0.1 localhost" > /sparkos/rootfs/etc/hosts
|
||||||
|
echo "127.0.1.1 sparkos" >> /sparkos/rootfs/etc/hosts
|
||||||
|
|
||||||
|
# Create passwd file
|
||||||
|
echo "root:x:0:0:root:/root:/bin/sh" > /sparkos/rootfs/etc/passwd
|
||||||
|
echo "spark:x:1000:1000:SparkOS User:/home/spark:/bin/sh" >> /sparkos/rootfs/etc/passwd
|
||||||
|
|
||||||
|
# Create group file
|
||||||
|
echo "root:x:0:" > /sparkos/rootfs/etc/group
|
||||||
|
echo "spark:x:1000:" >> /sparkos/rootfs/etc/group
|
||||||
25
scripts/docker-setup-rootfs.sh
Executable file
25
scripts/docker-setup-rootfs.sh
Executable file
@@ -0,0 +1,25 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Create minimal rootfs structure for SparkOS
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Create minimal rootfs structure
|
||||||
|
mkdir -p /sparkos/rootfs/bin \
|
||||||
|
/sparkos/rootfs/sbin \
|
||||||
|
/sparkos/rootfs/etc \
|
||||||
|
/sparkos/rootfs/proc \
|
||||||
|
/sparkos/rootfs/sys \
|
||||||
|
/sparkos/rootfs/dev \
|
||||||
|
/sparkos/rootfs/tmp \
|
||||||
|
/sparkos/rootfs/usr/bin \
|
||||||
|
/sparkos/rootfs/usr/sbin \
|
||||||
|
/sparkos/rootfs/usr/lib \
|
||||||
|
/sparkos/rootfs/var/log \
|
||||||
|
/sparkos/rootfs/var/run \
|
||||||
|
/sparkos/rootfs/root \
|
||||||
|
/sparkos/rootfs/home/spark
|
||||||
|
|
||||||
|
# Set proper permissions
|
||||||
|
chmod 1777 /sparkos/rootfs/tmp
|
||||||
|
chmod 700 /sparkos/rootfs/root
|
||||||
|
chmod 755 /sparkos/rootfs/home/spark
|
||||||
Reference in New Issue
Block a user