Я уже писал про то, как автоматом готовить голые docker-образы Astra Linux. Сегодня расскажу про образы для Ruby и NodeJS, но тут уже не будет готового решения, т.к. весь код показать не можем.
Вместо Ruby может быть что-то другое, но принцип общий.
Нас интересует версия Astra Linux Special Edition 1.7.2. Эта версия является производной (derivative) от Debian 10 Buster, поэтому теоретически, все что работает на buster, будет работать и на Astra Linux 1.7.2.
На момент написания этой статьи уже вышла версия 1.7.3, мы ее еще не тестировали, но логика должна быть похожей.
Docker-образ Ruby
Я пойду по пути наименьшего сопротивления: copy paste driven development:
Находим официальный репозиторий Ruby Dockerfile https://github.com/docker-library/ruby.
Ищем необходимую версию Ruby и тип релиза buster, в нашем случае это https://github.com/docker-library/ruby/blob/master/3.0/buster/Dockerfile.
Копируем файл в свой репозиторий
Заменяем
FROM buildpack-deps:buster
на конкретно мой случайARG astra_version=alse-slim-1.7.2-mg8.0.0
FROM ipodsekin/astralinux:${astra_version}Дальше скармливаем это сборщику ваших docker-образов (самый простой вариант:
docker build .
).
Чтобы проверить работоспособность Ruby, мы потрудились и прогнали unit-тесты из исходников Ruby - ошибок не выявлено, все замечательно.
Docker-образ NodeJS
Вам решать, готовить ли новый образ поверх образа Ruby, делать отдельный, либо засовывать все в один.
Для установки NodeJS необходимо добавить следующие строчки в ваш Dockerfile:
# Выбираем версию NodeJS
ARG node_version=12
RUN apt-get update && apt-get install -y debian-keyring curl
RUN curl -fsSL "https://deb.nodesource.com/setup_${node_version}.x" | sed 's/DISTRO=\$(lsb_release -c -s)/DISTRO="unnati"/g' | bash -
COPY etc/apt/preferences /etc/apt/
RUN apt-get update && apt-get install -y nodejs
# Чистим за собой
RUN apt-get clean && rm -rf /var/cache/apt/archives/* \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
&& truncate -s 0 /var/log/*log || true \
&& rm -f /etc/apt/sources.list.d/*node* \
&& rm -f /etc/apt/preferences
Код требует уточнения в следующих моментах:
-
Официальный установщик NodeJS не содержит логики для Astra Linux Special Edition. Ради интереса откройте в браузере скрипт https://deb.nodesource.com/setup_12.x, вы увидите, что поддерживается лишь вариант Орёл, он же Astra Linux Common Edition, а нашего нет.
Чтобы это исправить мы в скрипте налету с помощью sed заменяем текущий дистрибутив на первый попавшийся buster - unnati.
Тут просьба разработчикам Astra Linux: скоординируйте, пожалуйста, включение ALSE в официальный установщик nodejs. Если мы сразу начнем ставить пакет nodejs, то к нам прилетит старый пакет (на момент написания статьи он был версии 10) из репозитория Astra Linux Special Edition. Есть топорный метод: найти имя пакета с точной версией и поставить именно его, он у вас будет называться как-нибудь nodejs12.12.12debian1 или что-то в этом роде. Причем, эти версии обновляются у nodejs без предупреждения.
Чтобы избежать подобного поведения, мы заставим систему использовать официальный репозиторий nodejs, как более приоритетный.
Для этого в каталог /etc/apt/ скопируем файл preferences со следующим содержимым:Package: *
Pin: origin deb.nodesource.com
Pin-Priority: 950
Это позволит сначала загружать одноименные пакеты из deb.nodesource.com, а потом из репозитория Astra Linux, если не найден.
Заключение
Я не решился разбивать статью на две, чтобы не плодить сущности. А используя, описанные подходы можно также подготовить docker-образ Astra Linux с Python или PHP.
Дисклеймер
Ни я, ни моя компания не имеем отношения к производителю операционной системы Astra Linux. Все приведенные примеры предназначены только для образовательных целей.
Комментарии (7)
mashinkopochinko
16.12.2022 13:56+1только в самой астре, пакет с докером версией 2 годичной давности, по крайней мере так было пол года назад, возможно что-то изменилось
ZeroBot-Dot
18.12.2022 10:16Вы правы. Сегодня 18.12.2022:
dev@***:~$ cat /etc/os-release PRETTY_NAME="Astra Linux" NAME="Astra Linux" ID=astra ID_LIKE=debian ANSI_COLOR="1;31" HOME_URL="https://astralinux.ru" SUPPORT_URL="https://astralinux.ru/support" LOGO=astra VERSION_ID=1.7_x86-64 VERSION_CODENAME=1.7_x86-64 dev@***:~$ sudo docker --version [sudo] пароль для dev: Docker version 20.10.2+dfsg1, build 2291f61
Luchnik22
Спасибо за статью, с одной стороны понятно - импортозамещение, но с другой стороны используется Docker контейнеризация, на сколько имеет смысл использовать Astra Linux по сравнению с тем же Alpine внутри Docker'а?
serginho
как минимум чтобы тестировать приложение и не ставить отдельную astra linux машину
TyVik
Простите, но Astra Linux нужен именно из-за своего режима защищённости с мандаметками. Насколько я помню, это фишка ядра. Если вспомнить, что контейнеры используют общее ядро, то чтобы протестировать приложение в докере, его надо запускать изначально на Astra Linux.
serginho
Исключительно для тестирования, как мне кажется, права особо не нужны.
WondeRu Автор
Ну, вопрос интересный. Обычно, использование Astra Linux - это требование госклиента. Сейчас в РФ не купишь зарубежный Linux с поддержкой, а поддержка реально нужна для крупных заказчиков. Свои же внутренние проекты мы делаем исключительно на Apline- или Debian-образах.
По поводу Alpine меня недавно на хабре спустили на Землю, я доказывал, что использование Alpine всегда уменьшает размер образа. В ответ мне привели примеры, что Debian+Python+Pytorch занимает меньше места, чем Alpine+Python+Pytorch, магия!