Я уже писал про то, как автоматом готовить голые 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:

  1. Находим официальный репозиторий Ruby Dockerfile https://github.com/docker-library/ruby.

  2. Ищем необходимую версию Ruby и тип релиза buster, в нашем случае это https://github.com/docker-library/ruby/blob/master/3.0/buster/Dockerfile.

  3. Копируем файл в свой репозиторий

  4. Заменяем
    FROM buildpack-deps:buster
    на конкретно мой случай
    ARG astra_version=alse-slim-1.7.2-mg8.0.0
    FROM ipodsekin/astralinux:${astra_version}

  5. Дальше скармливаем это сборщику ваших 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

Код требует уточнения в следующих моментах:

  1. Официальный установщик NodeJS не содержит логики для Astra Linux Special Edition. Ради интереса откройте в браузере скрипт https://deb.nodesource.com/setup_12.x, вы увидите, что поддерживается лишь вариант Орёл, он же Astra Linux Common Edition, а нашего нет.

    Выдержка из кода установщика NodeJS 12
    Выдержка из кода установщика NodeJS 12

    Чтобы это исправить мы в скрипте налету с помощью sed заменяем текущий дистрибутив на первый попавшийся buster - unnati.
    Тут просьба разработчикам Astra Linux: скоординируйте, пожалуйста, включение ALSE в официальный установщик nodejs.

  2. Если мы сразу начнем ставить пакет 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)


  1. Luchnik22
    16.12.2022 11:40
    +1

    Спасибо за статью, с одной стороны понятно - импортозамещение, но с другой стороны используется Docker контейнеризация, на сколько имеет смысл использовать Astra Linux по сравнению с тем же Alpine внутри Docker'а?


    1. serginho
      16.12.2022 13:16

      как минимум чтобы тестировать приложение и не ставить отдельную astra linux машину


      1. TyVik
        16.12.2022 20:55
        +1

        Простите, но Astra Linux нужен именно из-за своего режима защищённости с мандаметками. Насколько я помню, это фишка ядра. Если вспомнить, что контейнеры используют общее ядро, то чтобы протестировать приложение в докере, его надо запускать изначально на Astra Linux.


        1. serginho
          17.12.2022 17:48

          Исключительно для тестирования, как мне кажется, права особо не нужны.


    1. WondeRu Автор
      16.12.2022 14:35

      Ну, вопрос интересный. Обычно, использование Astra Linux - это требование госклиента. Сейчас в РФ не купишь зарубежный Linux с поддержкой, а поддержка реально нужна для крупных заказчиков. Свои же внутренние проекты мы делаем исключительно на Apline- или Debian-образах.

      По поводу Alpine меня недавно на хабре спустили на Землю, я доказывал, что использование Alpine всегда уменьшает размер образа. В ответ мне привели примеры, что Debian+Python+Pytorch занимает меньше места, чем Alpine+Python+Pytorch, магия!


  1. mashinkopochinko
    16.12.2022 13:56
    +1

    только в самой астре, пакет с докером версией 2 годичной давности, по крайней мере так было пол года назад, возможно что-то изменилось


    1. 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