пока весь мир делает обратное, я научился конвертить докер контейнеры в виртуальные машины. цель - быстро делать образы VMок (образы hdd) без виртуализации.
18 Dec
2018
Дата рождения: 17.01.1984
айтишнег, веллер
пока весь мир делает обратное, я научился конвертить докер контейнеры в виртуальные машины. цель - быстро делать образы VMок (образы hdd) без виртуализации.
а где можно посмотреть на скрипт?
#!/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 && (
don-Rumata, кажется тут ограничение на длину сообщений. всё не влезло ))
don-Rumata, https://gist.github.com/Ri0...e5c08aa8e52ac86737b7 не знаю откроется ли секретный gist. не хочется его шарить, ибо NDA и всё такое..
А зачем?
А зачем? Конвертить большую библиотеку докеровских образов?
Прочитал ещё раз. Packer не умеет в vmdk?