Добавление ПО в контейнер UBI#

UBI создаются на основе подмножества содержимого ОС. Они также предоставляют подмножество пакетов, которые свободно доступны для установки и использования. Для добавления или обновления ПО в работающий контейнер можно использовать репозитории dnf. Они включают пакеты RPM и обновления. UBI предоставляют набор готовых образов контейнеров среды выполнения на языках программирования, таких как Python, Node.js, Ruby и прочих.

Для добавления пакетов из репозиториев UBI в запущенные контейнеры:

  • В init-образах и стандартных образах используйте команду dnf;

  • В минимальных образах используйте команду microdnf.

Примечание

Установленные программные пакеты не сохраняются в образе. Работать с ними возможно временно, только в запущенных контейнерах.

Использование init-образов UBI#

Можно создать контейнер с использованием Containerfile, устанавливающий и настраивающий веб-сервер (httpd) для автоматического запуска службой systemd (/sbin/init) при запуске контейнера в хост-системе.

Команда podman build создает образ, используя инструкции в одном или нескольких Containerfile, и указанный каталог контекста сборки.

Контекстный каталог может указываться как URL-архив, репозиторий Git или файл Containerfile. Если он не указан, то текущий рабочий каталог рассматривается как контекст сборки и должен содержать указанный ранее файл. Также можно указывать Containerfile с опцией --file.

Сценарий#

Чтобы использовать init-образы UBI, выполните следующие действия:

  1. Создайте Containerfile со следующим содержимым в новый каталог:

    FROM registry.example.ru/ubi9/ubi-init
    RUN dnf -y install httpd; dnf clean all; systemctl enable httpd;
    RUN echo "Successful Web Server Test" > /var/www/html/index.html
    RUN mkdir /etc/systemd/system/httpd.service.d/; echo -e '[Service]\nRestart=always' > /etc/systemd/system/httpd.service.d/httpd.conf
    EXPOSE 80
    CMD [ "/sbin/init" ]
    

    Containerfile устанавливает пакет httpd, разрешает службе httpd запускаться во время загрузки, создает тестовый файл index.html. Также предоставляет веб-сервер хосту (порт 80) и запускает службу systemd (/sbin/init) при запуске контейнера.

  2. Создайте контейнер:

    podman build --format=docker -t mysysd .
    
  3. Опционально: Для запуска контейнеров с включенными systemd и установите логическую переменную container_manage_cgroup:

    setsebool -P container_manage_cgroup 1
    
  4. Запустите контейнер с именем mysysd_run:

    podman run -d --name=mysysd_run -p 80:80 mysysd
    

    Образ mysysd запускается как контейнер mysysd_run в качестве процесса-демона, при этом порт 80 из контейнера соответствует порту 80 на хост-системе.

    Примечание

    Пользователю без административных полномочий необходимо выбрать номер порта хоста >= 1024. Например:

    podman run -d --name=mysysd -p 8081:80 mysysd
    

    Для использования номеров портов < 1024 необходимо изменить переменную net.ipv4.ip_unprivileged_port_start:

    sysctl net.ipv4.ip_unprivileged_port_start=80
    
  5. Проверьте работу контейнера:

    podman ps
    

    Пример вывода команды:

    a282b0c2ad3d  localhost/mysysd:latest  /sbin/init  15 seconds ago  Up 14 seconds ago  0.0.0.0:80->80/tcp  mysysd_run
    
  6. Протестируйте веб-сервер:

    curl localhost/index.html
    

    Пример вывода команды:

    Successful Web Server Test
    

Использование микро-образов UBI#

Можно создать образ контейнера ubi-micro с помощью инструмента Buildah.

  1. Извлеките и соберите образ registry.example.ru/ubi8/ubi-micro:

    microcontainer=$(buildah from registry.example.ru/ubi9/ubi-micro)
    
  2. Смонтируйте корневую файловую систему работающего контейнера:

    micromount=$(buildah mount $microcontainer)
    
  3. Установите службу httpd в каталог micromount:

    dnf install \
    --installroot $micromount \
    --releasever=/ \
    --setopt install_weak_deps=false \
    --setopt=reposdir=/etc/yum.repos.d/ \
    --nodocs -y \
    httpd
    dnf clean all \
    --installroot $micromount
    
  4. Размонтируйте корневую файловую систему в работающем контейнере:

    buildah umount $microcontainer
    
  5. Создайте образ ubi-micro-httpd из рабочего контейнера:

    buildah commit $microcontainer ubi-micro-httpd
    

Проверка#

Выведите подробную информацию об образе ubi-micro-httpd:

podman images ubi-micro-httpd

Пример вывода команды:

localhost/ubi-micro-httpd latest 7c557e7fbe9f  22 minutes ago  151 MB

Добавление ПО в стандартный контейнер UBI#

Для добавления ПО в стандартный контейнер UBI, отключите репозитории dnf, отличные от UBI. Это гарантирует вожможность перераспределения создаваемых контейнеров.

  1. Извлеките и запустите образ registry.example.ru/ubi9/ubi:

    podman run -it --name myubi registry.example.ru/ubi9/ubi
    
  2. Добавьте пакет в контейнер myubi:

    • Чтобы добавить пакет, находящийся в репозитории UBI, отключите все репозитории dnf, кроме UBI. Например, чтобы добавить пакет bzip2, введите:

      dnf install --disablerepo=* --enablerepo=ubi-8-appstream-rpms --enablerepo=ubi-8-baseos-rpms bzip2
      
    • Чтобы добавить пакет, отсутствующий в репозитории UBI, не отключайте репозитории. Например, для добавления пакета zsh, введите:

      dnf install zsh
      
    • Чтобы добавить пакет, находящейся в другом репозитории, включите нужный. Например, для установки пакета python38-devel из репозитория codeready-example-repo-x86_64-rpms, используйте:

      dnf install --enablerepo=codeready-example-repo-x86_64-rpms python38-devel
      

Проверка#

  1. Выведите список всех включенных репозиториев внутри контейнера:

    dnf repolist
    
  2. Убедитесь, что в списке присутствуют необходимые репозитории;

  3. Раскройте список всех установленных пакетов:

    rpm -qa
    
  4. Убедитесь, что в списке присутствуют необходимые пакеты.

Добавление ПО в минимальный контейнер UBI#

Репозитории UBI включены в минимальные образы UBI по умолчанию.

  1. Извлеките и запустите образ registry.example.ru/ubi9/ubi-minimal:

    podman run -it --name myubimin registry.example.ru/ubi9/ubi-minimal
    
  2. Добавьте пакет в контейнер myubimin:

    • Чтобы добавить пакет, находящийся в репозитории UBI, не отключайте репозитории. Например, для добавления пакета bzip2 введите:

      microdnf install bzip2
      
    • Чтобы добавить пакет из другого репозитория хоста, включите необходимый репозиторий. Например, для установки пакета python38-devel из репозитория codeready-builder-for-slo-9-x86_64-rpms используйте:

      microdnf install --enablerepo=codeready-builder-for-slo-9-x86_64-rpms python38-devel
      

Проверка#

Можете проверить данный сценарий, выполнив следующие действия:

  1. Выведите список всех включенных репозиториев внутри контейнера:

    microdnf repolist
    
  2. Убедитесь, что в списке присутствуют необходимые репозитории;

  3. Раскройте список всех установленных пакетов:

    rpm -qa
    
  4. Убедитесь, что в списке присутствуют все необходимые пакеты.

Добавление ПО в контейнер UBI на хосте#

Чтобы добавить ПО в контейнер UBI, выполните следующие действия:

  • Добавьте пакет в запущенный контейнер на основе минимальных или init-образов UBI. Не отключайте репозитории;

  • Используйте команду podman run для запуска контейнера, затем используйте команду dnf install внутри контейнера:

    • Чтобы добавить пакет bzip2 в контейнер на основе стандартного образа, введите:

      podman run -it --name myubi registry.example.ru/ubi9/ubi
      dnf install bzip2
      
    • Чтобы добавить пакет bzip2 в контейнер на основе init, используйте команду:

      podman run -it --name myubimin registry.example.com/ubi9/ubi-minimal
      microdnf install bzip2
      

Проверка#

Чтобы проверить контейнеры UBI, выполните следующие действия:

  1. Выведите список всех включенных репозиториев:

    • Для получения списка всех включенных репозиториев внутри контейнеров на основе стандартных или init-образов введите:

      dnf repolist
      
    • Для получения списка всех включенных репозиториев внутри контейнеров на основе минимальных образов выполните:

      microdnf repolist
      
  2. Убедитесь, что в списке приведены необходимые репозитории;

  3. Раскройте список всех установленных пакетов:

    rpm -qa
    
  4. Убедитесь, что в списке приведены необходимые пакеты.

Создание образов на основе UBI#

Можно создать контейнер веб-сервера на основе UBI из Containerfile с помощью утилиты Buildah. Для этого необходимо отключить все репозитории dnf, отличные от UBI, чтобы образ содержал только распространяемое ПО.

Примечание

Для минимальных образов UBI используйте команду microdnf вместо dnf: RUN microdnf update -y && rm -rf /var/cache/yum и RUN microdnf install httpd -y && microdnf clean all.

  1. Создайте Containerfile:

    FROM registry.example.ru/ubi9/ubi
    USER root
    LABEL maintainer="Sasha Ivanov"
    # Обновите образ
    RUN dnf update --disablerepo=* --enablerepo=ubi-8-appstream-rpms --enablerepo=ubi-8-baseos-rpms -y && rm -rf /var/cache/yum
    RUN dnf install --disablerepo=* --enablerepo=ubi-8-appstream-rpms --enablerepo=ubi-8-baseos-rpms httpd -y && rm -rf /var/cache/yum
    # Добавьте веб-страницу по умолчанию и укажите порт
    RUN echo "The Web Server is Running" > /var/www/html/index.html
    EXPOSE 80
    # Запустите службу
    CMD ["-D", "FOREGROUND"]
    ENTRYPOINT ["/usr/sbin/httpd"]
    
  2. Создайте образ контейнера:

    buildah bud -t sashaivanov/webserver .
    

    Пример вывода команды:

    STEP 1: FROM registry.example.ru/ubi9/ubi:latest
    STEP 2: USER root
    STEP 3: LABEL maintainer="Sasha Ivanov"
    STEP 4: RUN dnf update --disablerepo=* --enablerepo=ubi-8-appstream-rpms --enablerepo=ubi-8-baseos-rpms -y
    ...
    Writing manifest to image destination
    Storing signatures
    --> f9874f27050
    f9874f270500c255b950e751e53d37c6f8f6dba13425d42f30c2a8ef26b769f2
    

Проверка#

Для проверки корректрой работы веб-сервера выполните следующие действия:

  1. Запустите веб-сервер:

    podman run -d --name=myweb -p 80:80 sashaivanov/webserver
    

    Пример вывода команды:

    bbe98c71d18720d966e4567949888dc4fb86eec7d304e785d5177168a5965f64
    
  2. Протестируйте веб-сервер:

    curl http://localhost/index.html
    

    Пример вывода команды:

    The Web Server is Running