Как добавить циклическое устройство в Docker на этапе сборки?
Цель - собрать образ для кросс-компиляции приложения на C++. Образ должен содержать кросс-компилятор и sysroot целевой платформы. Чтобы создать sysroot, я беру образ операционной системы, подключаю его к циклическому устройству, монтирую в локальную файловую систему, выполняю chroot, устанавливаю в него необходимые зависимости и копирую необходимые файлы из примонтированного образа в локальную директорию. Циклические устройства можно добавить в Docker только в привилегированном режиме, но мне не удалось найти способ, как активировать его на этапе сборки образа. В настоящее время я делаю так:
docker create -it --privileged --name=build-sysroot-container --network host --device=/dev/loop-control --device=/dev/loop0 build-debian-host
docker start build-sysroot-container
# Скрипт make_sysroot.sh использует циклическое устройство
docker container cp <dir/on/the/host>/make_sysroot.sh build-sysroot-container:/root/scripts/make_sysroot.sh
docker container exec build-sysroot-container bash -c "/root/scripts/make_sysroot.sh"
docker commit build-sysroot-container sysroot-debian
docker stop build-sysroot-container
docker rm build-sysroot-container
Фрагмент скрипта make_sysroot.sh, монтирующий образ в файловую систему:
loop=$(losetup --show -fP myimg-empty.img)
mount ${loop}p2 /root/mnt
Вывод fdisk -l myimg-empty.img:
Disk myimg-empty.img: 5.58 GiB, 5989466112 bytes, 11698176 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x442e675f
Device Boot Start End Sectors Size Id Type
myimg-empty.img1 8192 1056767 1048576 512M c W95 FAT32 (LBA)
myimg-empty.img2 1056768 11698175 10641408 5.1G 83 Linux
Очевидно, что этот способ не так удобен, как Dockerfile, базовый образ будет целиком включён в новый образ, а в созданном образе будет утеряна информация о базовых образах и других слоях. Есть ли способ добиться того же результата с применением Dockerfile?
Ответы (1 шт):
512M c W95 FAT32 (LBA) - это похоже efi раздел для малины. В разрезе кросскомпиляции можно его оставить статичным. Запаковать чтоб место поменьше занимал.
5.1G 83 Linux - это рутфс и его заменим на папку которую можно поддерживать как ридонли маунт или copy в докерфайле. Только она и нужна для кросскомпиляции из этого образа.
После компиляции можно собрать образ из папки в фс. Используйте mke2fs -d чтоб сделать раздел в файле.
Потом готовишь болванку соединив 3 куска: 8192*512 байт пустого, фат раздел, линукс раздел. Через fdisk размечай разделы на этом файле.