При использовании в разработке официального образа Debian я часто сталкиваюсь с недоступностью официальных репозиториев deb.debian.org, причем при замене образов начинается конфликт версий пакетов. Так и появилась данная статья, где мы:
- Создадим базовый образ системы Debian при помощи
debootstrap
- Внесем в него свои правки
- Упакуем образ системы в Docker-образ
Вам понадобится:
- Linux
- Установленный Docker
- Пакеты
tar, chroot
¶ Создание базового образа
Один из простых способов для создания базовой системы - debootstrap
. Данный инструмент используется для установки Debian или Ubuntu из другой для выполнения установок на другие диски или развертывания экземпляра ОС внутри другой для использования через chroot
. Именно таким образом мы и планируем воспользоваться данной утилитой
Установите пакет debootstrap
. Он доступен не только под Debian, но и например под Gentoo, RHEL, Ubuntu и др. Примерные команды:
sudo apt-get install debootstrap -y # Debian/Ubuntu
sudo emerge -av dev-util/debootstrap # Gentoo
sudo yum install debootstrap.noarch # RHEL, требуется EPEL
После установки пакета мы готовы к создранию экземляра системы. При создании мы можем указать архитектуру системы, версию системы в виде ее наименования (или stable
для текущей версии) и репозитория, откуда будет произведена загрузка пакетов. После, данный репозиторий в настройках APT в системе. Примеры команд:
# создаем систему последней версии (13 на момент написания статьи) из стандартного репозитория в директории "stable-debian"
sudo debootstrap stable ./stable-debian http://deb.debian.org/debian/
Я для своих целей создал систему 12 версии, используя репозиторий Казанского федерального университета в директории debian
:
sudo debootstrap bookworm ./debian http://mirror.kpfu.ru/debian/
После запуска команды будет создана указанная вами директория и вы удивите следующее:
W: Cannot check Release signature; keyring file not available /usr/share/keyrings/debian-archive-keyring.gpg
I: Retrieving InRelease
I: Retrieving Packages
I: Validating Packages
I: Resolving dependencies of required packages...
I: Resolving dependencies of base packages...
I: Checking component main on http://mirror.kpfu.ru/debian...
I: Retrieving adduser 3.134
I: Validating adduser 3.134
I: Retrieving apt 2.6.1
I: Validating apt 2.6.1
#<...>
I: Chosen extractor for .deb packages: dpkg-deb
I: Extracting adduser...
I: Extracting apt...
I: Extracting base-files...
#<...>
I: Installing core packages...
I: Unpacking required packages...
I: Unpacking adduser...
I: Unpacking apt...
I: Unpacking base-files...
#<...>
I: Unpacking the base system...
И на последнем сообщении, процесс подготовки системы завершен! Наша система весит около 400 мегабайт.
¶ Правим chroot-систему
После создания системы, единственные правки заключаются в том, что мы указали свои репозитории. Теперь зайдем в систему используя команду chroot
.
sudo chroot ./debian /bin/bash
Теперь мы внутри Debian! Можете править конфигурации, устанавливать пакета и вносить другие правки. Для выхода воспользуйтесь командой exit
.
¶ Создаем Docker-образ
После завершения правок, наша задача упаковать директорию в .tar.gz
архив, который будет использоваться в файле сборки контейнера Dockerfile
cd debian
sudo tar -czf ../rootfs.tar.gz .
cd ..
Теперь, подготовим директорию в которой мы находится к сборке. Для сокращения контекста сборки рекомендую создать файл .dockerignore
со следующим содержанием:
*
!rootfs.tar.gz
# можете добавить другие нужные файлы и директории через "!"
После, создаем Dockerfile
:
FROM scratch
ADD rootfs.tar.gz /
Так выглядит минимальный образ. Можно добавить команду по умолчанию, скопировать дополнительные файлы, переменные окружения (например, если вы что-то досустановили) или собрать в таком виде при помощи команды:
sudo docker build -t mydebian .
После успешной сборки можете запустить образ и проверить, что он корретно собран:
sudo docker run -it --rm mydebian /bin/bash
# выход при помощи команды "exit"
На этом все! Теперь вы стали чуточку независимей в вопросах образов, как и я.