Готовим docker-образы Astra Linux с Ruby и NodeJS

от автора

Я уже писал про то, как автоматом готовить голые 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. Все приведенные примеры предназначены только для образовательных целей.


ссылка на оригинал статьи https://habr.com/ru/post/705860/