Создаем Debian-контейнер с нуля

16.09.2025

Илья Замарацких

Docker

Linux

Содержание

При использовании в разработке официального образа Debian я часто сталкиваюсь с недоступностью официальных репозиториев deb.debian.org, причем при замене образов начинается конфликт версий пакетов. Так и появилась данная статья, где мы:

Вам понадобится:

  • 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"

На этом все! Теперь вы стали чуточку независимей в вопросах образов, как и я.