При использовании в разработке официального образа Debian я часто сталкиваюсь с недоступностью официальных репозиториев deb.debian.org, причем при замене образов начинается конфликт версий пакетов. Так и появилась данная статья, где мы:
- Создадим базовый образ системы Debian при помощи
debootstrap - Внесем в него свои правки
- Упакуем образ системы в Docker-образ
Вам понадобится:
- Linux
- Установленный Docker
- Пакеты
tar, chroot
¶ Создание базового образа
Один из простых способов для создания базовой системы - debootstrap. Данный инструмент используется для установки Debian или Ubuntu из другой для выполнения установок на другие диски или развертывания экземпляра ОС внутри другой для использования через chroot. Именно таким образом мы и планируем воспользоваться данной утилитой
Установите пакет debootstrap. Он доступен не только под Debian, но и например под Gentoo, RHEL, Ubuntu и др. Примерные команды:
После установки пакета мы готовы к создранию экземляра системы. При создании мы можем указать архитектуру системы, версию системы в виде ее наименования (или stable для текущей версии) и репозитория, откуда будет произведена загрузка пакетов. После, данный репозиторий в настройках APT в системе. Примеры команд:
# создаем систему последней версии (13 на момент написания статьи) из стандартного репозитория в директории "stable-debian"
Я для своих целей создал систему 12 версии, используя репозиторий Казанского федерального университета в директории debian:
После запуска команды будет создана указанная вами директория и вы удивите следующее:
;
#<...>
#<...>
#<...>
И на последнем сообщении, процесс подготовки системы завершен! Наша система весит около 400 мегабайт.
¶ Правим chroot-систему
После создания системы, единственные правки заключаются в том, что мы указали свои репозитории. Теперь зайдем в систему используя команду chroot.
Теперь мы внутри Debian! Можете править конфигурации, устанавливать пакета и вносить другие правки. Для выхода воспользуйтесь командой exit.
¶ Создаем Docker-образ
После завершения правок, наша задача упаковать директорию в .tar.gz архив, который будет использоваться в файле сборки контейнера Dockerfile
Теперь, подготовим директорию в которой мы находится к сборке. Для сокращения контекста сборки рекомендую создать файл .dockerignore со следующим содержанием:
*
!rootfs.tar.gz
После, создаем Dockerfile:
FROM scratch
ADD rootfs.tar.gz /
Так выглядит минимальный образ. Можно добавить команду по умолчанию, скопировать дополнительные файлы, переменные окружения (например, если вы что-то досустановили) или собрать в таком виде при помощи команды:
После успешной сборки можете запустить образ и проверить, что он корретно собран:
# выход при помощи команды "exit"
На этом все! Теперь вы стали чуточку независимей в вопросах образов, как и я.