- Как получить Docker образ астралинукса CE?
- техническое
- для удобства
- Создание Docker образа Astra Linux
- Сборка chroot-окружения
- Настройка chroot-окружения
- Создание образа Docker
- Загрузка сценария
- Запуск и работа сценария создания Docker-образов Astra Linux
- Запуск созданного образа
- Дополнительные настройки создаваемых образов
- Создание собственного образа Astra Linux для использования в Docker
- Установка пакетов
- Создание собственного образа
- Пример сценария создания собственного образа
Как получить Docker образ астралинукса CE?
надеюсь, вы понимаете, что программа linux будет той же самой, что и в используемой вами хост-системе, и если запускаемому вами процессу требуется, к примеру, та же «доверенная загрузка» именно в той реализации, которая вкомпилирована в программу linux из дистрибутива astra, то правильно функционировать он не будет.
техническое
как и для любого дистрибутива, надо создать минимальный chroot и из него — образ:
$ sudo tar -C каталог-с-chroot-ом -c . | docker import - название-образа
создать chroot , как и для любого основанного на debian gnu/linux дистрибутива, можно с помощью скрипта debootstrap (входит в одноимённый пакет во многих, даже не основанных на debian gnu/linux, дистрибутивах):
$ sudo debootstrap выпуск каталог-где-будет-создан-chroot ссылка-на-репозиторий
docker-овцами подготовлен скрипт-обёртка вокруг debootstrap. там делаются docker-специфичные оптимизации, но основную работу, конечно, выполняет сам оригинальный скрипт:
$ wget https://github.com/moby/moby/raw/master/contrib/mkimage/debootstrap
в качестве выпуска надо указать orel . нужный для debootstrap конфигурационный файл можно взять непосредственно из пакета debootstrap из репозитория дистрибутива — https://mirror.yandex.ru/astra/current/orel/repository/pool/main/d/debootstrap/
для удобства
набросал (на основе используемой в работе) программку для gnu make. запускать её имеет смысл только на debian-основных дистрибутивах (используется программа dpkg-deb), должен быть установлен пакет debootstrap:
suite = orel repo = http://mirror.yandex.ru/astra/current/$(suite)/repository deblink = $(shell wget -qO - $(repo)/dists/$(suite)/main/binary-amd64/Packages.gz | zcat | sed -rn '/^Package: debootstrap$$/,/^Filename:/') debname = $(notdir $(deblink)) script = debootstrap scriptlink = https://github.com/moby/moby/raw/master/contrib/mkimage/$(script) suiteconf = /usr/share/debootstrap/scripts/$(suite) all: $(suite).hash $(suiteconf): $(debname) dpkg-deb -x $ < undeb sudo cp undeb$@ $@ $(debname): wget -qO $@ $(repo)/$(deblink) $(suite).hash: $(suite) sudo tar -C $< -c . | sudo docker import - $< >$@ @echo "готово" $(suite): $(script) if [ -d $@ ]; then sudo rm -rf $@; fi LC_ALL=C sudo bash $< $@ $(notdir $@) $(repo) $(script): $(suiteconf) wget -q $(scriptlink) -O $@
в результате её работы будет создан docker-образ с именем orel :
$ sudo docker run -it --rm orel cat /etc/os-release PRETTY_NAME="Astra Linux (Orel 2.11.6)" NAME="Astra Linux (Orel)" ID=astra ID_LIKE=debian ANSI_COLOR="1;31" HOME_URL="http://www.astra-linux.com/" SUPPORT_URL="http://www.astra-linux.com/support" VARIANT_ID=orel VARIANT=Orel VERSION_ID=2.11.6
всё, что будет создано скриптом в текущем каталоге (и конфигурационный файл /usr/share/debootstrap/scripts/orel ), после создания образа можно удалять.
Создание Docker образа Astra Linux
Образ дистрибутива Astra Linux, как и любого дистрибутива, основанного на Debian, создаётся в три этапа:
1)Выполняется сборка chroot-окружения с помощью debootstrap;
2)Выполняется настройка chroot-окружения;
3)Полученное chroot-окружение конвертируется в образ Docker.
Сборка chroot-окружения
Сборка производится с помощью команды debootstrap:
debootstrap --variant=minbase --include locales,lsb-release --components=main,contrib,non-free orel /var/astra-chroot http://dl.astralinux.ru/astra/stable/2.12_x86-64/repository
Данная команда создаст chroot-окружение ОС Astra Linux “Орёл”.
Настройка chroot-окружения
Настройка созданного образа осуществляется посредством входа в chroot-окружение с помощью команды chroot:
echo "ru_RU.UTF-8 UTF-8" >> /etc/locale.gen echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen locale-gen update-locale ru_RU.UTF-8
Хорошим тоном при создании образов Docker является максимальное уменьшение его размера. Очистка кэша apt наиболее значительно уменьшает размеры итогового образа и не влияет на функциональность образа:
apt update mv /etc/apt/sources.list.bak /etc/apt/sources.list apt-get autoclean apt clean
Создание образа Docker
tar -C /var/astra-chroot -cpf - . |docker import\ - astralinux:orel\ --change "ENV PATH /usr/local/sbin:/usr/local/bin\ :/usr/sbin:/usr/bin:/sbin:/bin"\ --change 'CMD ["/bin/bash"]'\ --change "ENV LANG=ru_RU.UTF-8"
В результате будет создан образ с российской локализацией и точкой входа в bash. Итоговый размер образа – 204 мегабайта.
Загрузка сценария
Загрузить сценарий build-docker-image.sh и сохранить в текущем каталоге в файле с именем build-docker-image.sh.
Разрешить выполнение сценария:
Запуск и работа сценария создания Docker-образов Astra Linux
- Обязательные:
- -r — путь к репозиторию, из которого будет выполняться сборка образа;
- -i — имя файла с собранным образом;
- -c — имя собираемого дистрибутива (должно находиться в каталоге dists указанного репозитория);
- -b — установка только базовых пакетов;
- -v — вывести версию сценария;
Вызов сценария без параметров покажет список параметров .
Так, например, для создания образа Astra Linux CE 2.12 пользователь, входящий в группу docker, может использовать следующую команду:
- Создаются временные файлы в каталоге /tmp;
- Фактически создаются два образа:
- Базовый образ с именем, заданным при запуске сценария, дополненным суффиксом -rootfs;
- Рабочий образ с именем, заданным при запуске сценария;
Запуск созданного образа
Пользователь, входящий в группу docker может запустить собранный образ (образ с именем astra_linux_ce_2.12) командой:
Образ, созданный в примере выше из репозитория testing, может быть запущен командой:
Дополнительные настройки создаваемых образов
Представленный выше сценарий может быть доработан для кастомизации создаваемых образов. Для этого удобно использовать возможность выполнения команд внутри образа при создании образа. Образ создается командой docker build. В предложенном выше сценарии выполняется только одна команда RUN apt-get update:
. docker build --network=host --no-cache=true -t "$IMAGE" -
Далее приведен пример, позволяющий при создании образа сразу установить обновления. Изменения внесены в строки RUN:
. docker build --network=host --no-cache=true -t "$IMAGE" - etc/apt/sources.list RUN [ -z $UPDATE ] || echo "deb $UPDATE $CODENAME contrib main non-free" >> etc/apt/sources.list RUN apt-get update && apt-get install -y --no-install-recommends apt-utils RUN apt-get dist-upgrade -y RUN apt-get -f install -y WORKDIR / CMD bash EOF .
Обновления устанавливаются из репозитория, передаваемого через значение переменной окружения UPDATE. Указанный репозиторий добавляется в список репозиториев пакетов в файле /etc/apt/sources.list, после чего выполняется обновление. Вызов сценария с указанием дополнительного репозитория:
Создание собственного образа Astra Linux для использования в Docker
Для применения в более ранних обновлениях см. пояснения в тексте.
Установка пакетов
Установить пакеты, необходимые для создания собственных образов Docker, можно либо с помощью графического менеджера пакетов (см. Графический менеджер пакетов synaptic) либо из командной строки командой:
Создание собственного образа
Собственный образ создается в три этапа:
- Выполняется сборка chroot-окружения;
- Выполняется настройка chroot-окружения;
- Полученное chroot-окружение конвертируется в образ Docker.
- Сборка chroot-окружения выполняется командой debootstrap. При установке для удобства дальнейшей работы в chroot-окружении можно (не обязательно) сразу установить пакеты ncurses-term, mc, locales, nano, gawk, lsb-release, acl, perl-modules-5.28. Варианты установки:
- Если каталоги репозиториев доступны по сети, то загрузка пакетов для сборки может выполняться непосредственно из этих сетевых репозиториев, например, для Astra Linux Special Edition - из общедоступного сетевого репозитория. В примерах ниже chroot-окружение Astra Linux создаётся в каталоге /var/docker-chroot.
Каталог /var для размещения chroot-окружения выбран потому, что по умолчанию в Astra Linux Special Edition начиная с обновления БЮЛЛЕТЕНЬ № 2022-0819SE17 (оперативное обновление 1.7.2) он имеет метку безопасности 3:63:-1:ccnr, позволяющую создавать в нем файловые объекты с любыми метками безопасности. При работе в более ранних обновлениях Astra Linux следует самостоятельно создать подобный каталог (установить метку на каталог /var). Далее в примерах команды выполняются в привилегированном режиме (от имени администратора с правами суперпользователя (при включенном МКЦ - администратора с правами суперпользователя и с высоким уровнем целостности). Для работы пользователей в непривилегированном режиме администратором системы должен быть создан доступный пользователю каталог с необходимой меткой безопасности.
Для Astra Linux Special Edition опция --components=main,contrib,non-free обязательна, без неё образ Astra Linux Special Edition собран не будет.
Для Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7) следует использовать код дистрибутива 1.7_x86-64, например:
sudo debootstrap \
--include ncurses-term,mc,locales,nano,gawk,lsb-release,acl,perl-modules-5.28 \
--components=main,contrib,non-free 1.7_x86-64 \
/var/docker-chroot \
http://dl.astralinux.ru/astra/stable/1.7_x86-64/repository-mainВ данном примере предполагается, что сетевые https-репозитории не используются (пакет apt-transport-https не нужен и не устанавливается).
sudo cp /etc/resolv.conf /var/docker-chroot/etc/resolv.conf
sudo cp /etc/apt/sources.list /var/docker-chroot/etc/apt/sources.listили, по необходимости, отредактировать файлы в окружении с помощью любого текстового редактора, например:
sudo chroot /var/docker-chroot
apt update
apt dist-upgrade
echo "ru_RU.UTF-8 UTF-8" >> /etc/locale.gen
echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
locale-gen
update-locale ru_RU.UTF-8
exitsudo tar -C /var/docker-chroot -cpf - . | \
sudo docker import - wiki/astralinux:se \
--change "ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" \
--change 'CMD ["/bin/bash"]' \
--change "ENV LANG=ru_RU.UTF-8"Если все операции выполнены успешно, то:
- Созданный образ должен отображаться в списке образов:
Пример сценария создания собственного образа
#!/bin/sh program=$(basename $0) version=1.0 set -e pkg_missing=false for required_pkg in docker.io debootstrap; do if ! dpkg -l $required_pkg >/dev/null 2>/dev/null; then printf 'Please install %s package\n' $required_pkg pkg_missing=true fi done if $pkg_missing; then exit 1 fi # Check docker can be run without sudo docker version 2>&1 >/dev/null ||\ (printf 'Please run with sudo or add your account to `docker` group\n';\ exit 1) usage="\ Usage: $program -v Print program version $program -r REPOSITORY [-c CODENAME] -i IMAGE_NAME [-b] Create Docker image IMAGE_NAME based on REPOSITORY with CODENAME -v Print version -r REPOSITORY Address of the repository -c CODENAME Codename (specified in $REPOSITORY/dists) -i IMAGE_NAME Name of the image being created -b Install base Astra Linux packages default CODENAME is \"stable\"" invalid_args() echo "$usage>" 1>&2 exit 1 > REPO=$REPO IMAGE=$IMAGE CODENAME="$CODENAME:-stable>" install_base_pkgs=false while getopts 'r:c:i:vb' option; do case $option in r) REPO=$OPTARG ;; i) IMAGE=$OPTARG ;; c) CODENAME=$OPTARG ;; b) install_base_pkgs=true ;; v) echo $program $version ;; ?) invalid_args ;; esac done if [ -z $REPO ]; then echo Please specify -r \(repository\) argument fi if [ -z $IMAGE ]; then echo Please specify -i \(image\) argument fi if [ -z $REPO ] || [ -z $IMAGE ]; then invalid_args fi ROOTFS_IMAGE="$IMAGE-rootfs" TMPDIR=`mktemp -d` cd $TMPDIR cleanup() cd $HOME # debootstrap leaves mounted /proc and /sys folders in chroot # when terminated by Ctrl-C sudo umount $TMPDIR/proc $TMPDIR/sys >/dev/null 2>/dev/null || true # Delete temporary data at exit sudo rm -rf $TMPDIR > trap cleanup EXIT sudo -E debootstrap --no-check-gpg --variant=minbase \ --components=main,contrib,non-free "$CODENAME" ./chroot "$REPO" echo "deb $REPO $CODENAME contrib main non-free" | sudo tee ./chroot/etc/apt/sources.list docker rmi "$ROOTFS_IMAGE" 2>/dev/null || true sudo tar -C chroot -c . | docker import - "$ROOTFS_IMAGE" docker rmi "$IMAGE" 2>/dev/null || true if $install_base_pkgs; then cmd="echo Installing base packages && apt-get install -y parsec parsec-tests linux-astra-modules-common astra-safepolicy lsb-release acl perl-modules-5.28 ca-certificates" else cmd="true" fi docker build --network=host --no-cache=true -t "$IMAGE" - <EOF FROM $ROOTFS_IMAGE ENV TERM xterm-256color ENV DEBIAN_FRONTEND noninteractive RUN apt-get update RUN $cmd WORKDIR / CMD bash EOF printf 'Docker image "%s" has been generated\n' "$IMAGE" exit 0