@rion

rion

rion
rion

Дата рождения: 17.01.1984

айтишнег, веллер

3 я читаю 21 меня читают
303 постов
469 комментариев
rion
18 Dec 2018

пока весь мир делает обратное, я научился конвертить докер контейнеры в виртуальные машины. цель - быстро делать образы VMок (образы hdd) без виртуализации.

Рекомендовано: Shai-Hulud
18 Dec 2018

Еще подменить вызов docker-composer этим скриптом, положить на dev сервер и злорадствовать...

18 Dec 2018

а где можно посмотреть на скрипт?

18 Dec 2018

don-Rumata,

#!/bin/bash

set -ex

thisscript=$(realpath $0)
BUILDDIR=$HOME/vmbuild

DISK_LOOPDEV=${DISK_LOOPDEV}
DISK_IMG=disk.img
DISK_MB=3000

BOOT_LOOPDEV=${BOOT_LOOPDEV}
BOOT_MB=100

ROOTFS_LOOPDEV=${ROOTFS_LOOPDEV}
ROOTFS_MB="100%" # percent only

DOCKER_CONT_NAME=dockervm_build
TMP_ROOTFS_MOUNT_DIR=

die() { echo "Error: $@"; exit 1; }

host_env() {
    mkdir -p $BUILDDIR/docker
    cd $BUILDDIR
    if [ -e "$BOOT_IMG" ]; then
        BOOT_LOOPDEV=$(losetup -j $BOOT_IMG | cut -d ':' -f 1)
    fi
    if [ -e "$ROOTFS_IMG" ]; then
        ROOTFS_LOOPDEV=$(losetup -j $ROOTFS_IMG | cut -d ':' -f 1)
    fi
}

ensure_disk() {
    if [ ! -e "$DISK_IMAGE" ]; then
        dd if=/dev/zero of=$DISK_IMG bs=4096 count=$((DISK_MB * 1024 * 1024 / 4096))
    fi
    DISK_LOOPDEV=$(losetup -j $DISK_IMG | cut -d ':' -f 1)
    if [ -z "${DISK_LOOPDEV}" ]; then
        losetup -f $DISK_IMG
        DISK_LOOPDEV=$(losetup -j $DISK_IMG | cut -d ':' -f 1)
        parted --script -a optimal $DISK_LOOPDEV mklabel msdos \
            mkpart primary 1Mib ${BOOT_MB}MiB \
            set 1 boot on \
            mkpart primary ${BOOT_MB}MiB ${ROOTFS_MB}
        partx -u $DISK_LOOPDEV
        ls ${DISK_LOOPDEV}*
    fi
    BOOT_LOOPDEV=${DISK_LOOPDEV}p1
    ROOTFS_LOOPDEV=${DISK_LOOPDEV}p2

    yes | mkfs.ext2 -q -L boot $BOOT_LOOPDEV
    yes | mkfs.ext4 -q -L root $ROOTFS_LOOPDEV

}

docker_build() {
    cp $thisscript ./docker/
    scriptname=$(basename "$thisscript")

    echo "$(cat <<-EOL
FROM ubuntu:xenial-20180726
COPY $scriptname /buildimg.sh
ENTRYPOINT ["/buildimg.sh", "inner"]
EOL
)" > docker/Dockerfile

    docker rmi dockervm:latest 2>/dev/null || true
    docker build -t dockervm docker/
    docker rm -f dockervm_build 2>/dev/null || true
    docker run --privileged -e BOOT_LOOPDEV=$BOOT_LOOPDEV \
        -e DISK_LOOPDEV=$DISK_LOOPDEV \
        -e ROOTFS_LOOPDEV=$ROOTFS_LOOPDEV \
        --name $DOCKER_CONT_NAME dockervm:latest
}

# special targets to be started inside of building docker
inner_cleanup() {
    if findmnt /boot >/dev/null; then
        umount /boot
    fi
    if [ -f /usr/sbin/grub-mkconfig.bak ]; then
        mv -f /usr/sbin/grub-mkconfig.bak /usr/sbin/grub-mkconfig
    fi
    if [ -f /etc/grub.d/10_linux.bak ]; then
        mv -f /etc/grub.d/10_linux.bak /etc/grub.d/10_linux
    fi
}

inner_build() {
    echo "I'm building something"

    trap "exit 1" 1 2 3 6 15
    trap inner_cleanup 0
    export RUNLEVEL=1 # https://github.com/Microsoft/WSL/issues/1761 (required for Ubuntu 16.04)

    rm /usr/sbin/policy-rc.d \
        && rm /sbin/initctl \
        && dpkg-divert --local --rename --remove /sbin/initctl

    [ -n "$DISK_LOOPDEV" -a -n "$BOOT_LOOPDEV" ] || die "Loop device for disk and for boot part can't be empty";
    apt-get update
    apt-get install -y udev

    # change root password to 1 (for debug purposes for now)
    echo -e "1\n1" | passwd root

    ROOTFS_UUID=$(blkid -o value -s UUID $ROOTFS_LOOPDEV)
    BOOT_UUID=$(blkid -o value -s UUID $BOOT_LOOPDEV)

    [ -n "$ROOTFS_UUID" ] && [ -n "$BOOT_UUID" ] || die "Failed to detect uuids of root/boot partitions"

    echo "$(cat <<EOL
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
UUID=${ROOTFS_UUID} /           ext4    errors=remount-ro 0       1
UUID=${BOOT_UUID}   /boot       ext2    defaults          0       1
EOL
)" > /etc/fstab

    if [ -d /boot ]; then mv /boot /tmp/; fi
    mkdir -p /boot
    mount "$BOOT_LOOPDEV" /boot
    if [ -d /tmp/boot ]; then cp -a /tmp/boot / && rm -rf /tmp/boot; fi
    apt-get install -y grub2 linux-generic-hwe-16.04
    grub-install --modules=part_msdos -s $DISK_LOOPDEV

    # We have to change grub-mkconfig to avoid grub-probe on overlayfs of docker
    #cp /usr/sbin/grub-mkconfig /usr/sbin/grub-mkconfig.bak
    sed -i.bak '/^GRUB_DEVICE=/d;/^GRUB_DEVICE_UUID=/d;/GRUB_DEVICE_BOOT=/d;/GRUB_DEVICE_BOOT_UUID=/d' /usr/sbin/grub-mkconfig
    sed -i.bak 's|/dev/loop|/dev/looop|g' /etc/grub.d/10_linux # our loop devices are special
    mkdir -p /dev/disk/by-uuid && (
#mxrcc/3 в ответ на /2
18 Dec 2018

О, спасибо, надо почитать.

#mxrcc/4 в ответ на /3
18 Dec 2018

don-Rumata, кажется тут ограничение на длину сообщений. всё не влезло ))

#mxrcc/5 в ответ на /4
18 Dec 2018

тогда лучше в гист гитхаба.

#mxrcc/6 в ответ на /5
18 Dec 2018

ну я вижу. На гитхабе залогинен.

#mxrcc/8 в ответ на /7
18 Dec 2018

Radjah, потому что быстрее и дешевле

#mxrcc/10 в ответ на /9
18 Dec 2018

dd if=/dev/zero of=$DISK_IMG bs=4096 count=$((DISK_MB * 1024 * 1024 / 4096))

truncate -s ${DISK_MB}M $DISK_IMG
Не?

#mxrcc/11 в ответ на /3
18 Dec 2018

Radjah, интересно. не знал что оно нулями заполняет.

#mxrcc/12 в ответ на /11
19 Dec 2018

А зачем? Конвертить большую библиотеку докеровских образов?

19 Dec 2018

Прочитал ещё раз. Packer не умеет в vmdk?

Добавить пост

Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
Для форматирования текста используется Markdown.