Добавление ПО в контейнер 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, выполните следующие действия:
Создайте
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) при запуске контейнера.Создайте контейнер:
podman build --format=docker -t mysysd .Опционально: Для запуска контейнеров с включенными systemd и установите логическую переменную
container_manage_cgroup:setsebool -P container_manage_cgroup 1Запустите контейнер с именем
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Проверьте работу контейнера:
podman psПример вывода команды:
a282b0c2ad3d localhost/mysysd:latest /sbin/init 15 seconds ago Up 14 seconds ago 0.0.0.0:80->80/tcp mysysd_runПротестируйте веб-сервер:
curl localhost/index.htmlПример вывода команды:
Successful Web Server Test
Использование микро-образов UBI#
Можно создать образ контейнера ubi-micro с помощью инструмента Buildah.
Извлеките и соберите образ
registry.example.ru/ubi8/ubi-micro:microcontainer=$(buildah from registry.example.ru/ubi9/ubi-micro)Смонтируйте корневую файловую систему работающего контейнера:
micromount=$(buildah mount $microcontainer)Установите службу
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Размонтируйте корневую файловую систему в работающем контейнере:
buildah umount $microcontainerСоздайте образ
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. Это гарантирует вожможность перераспределения создаваемых контейнеров.
Извлеките и запустите образ
registry.example.ru/ubi9/ubi:podman run -it --name myubi registry.example.ru/ubi9/ubiДобавьте пакет в контейнер
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
Проверка#
Выведите список всех включенных репозиториев внутри контейнера:
dnf repolistУбедитесь, что в списке присутствуют необходимые репозитории;
Раскройте список всех установленных пакетов:
rpm -qaУбедитесь, что в списке присутствуют необходимые пакеты.
Добавление ПО в минимальный контейнер UBI#
Репозитории UBI включены в минимальные образы UBI по умолчанию.
Извлеките и запустите образ
registry.example.ru/ubi9/ubi-minimal:podman run -it --name myubimin registry.example.ru/ubi9/ubi-minimalДобавьте пакет в контейнер
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
Проверка#
Можете проверить данный сценарий, выполнив следующие действия:
Выведите список всех включенных репозиториев внутри контейнера:
microdnf repolistУбедитесь, что в списке присутствуют необходимые репозитории;
Раскройте список всех установленных пакетов:
rpm -qaУбедитесь, что в списке присутствуют все необходимые пакеты.
Добавление ПО в контейнер 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, выполните следующие действия:
Выведите список всех включенных репозиториев:
Для получения списка всех включенных репозиториев внутри контейнеров на основе стандартных или init-образов введите:
dnf repolistДля получения списка всех включенных репозиториев внутри контейнеров на основе минимальных образов выполните:
microdnf repolist
Убедитесь, что в списке приведены необходимые репозитории;
Раскройте список всех установленных пакетов:
rpm -qaУбедитесь, что в списке приведены необходимые пакеты.
Создание образов на основе 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.
Создайте
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"]Создайте образ контейнера:
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
Проверка#
Для проверки корректрой работы веб-сервера выполните следующие действия:
Запустите веб-сервер:
podman run -d --name=myweb -p 80:80 sashaivanov/webserverПример вывода команды:
bbe98c71d18720d966e4567949888dc4fb86eec7d304e785d5177168a5965f64Протестируйте веб-сервер:
curl http://localhost/index.htmlПример вывода команды:
The Web Server is Running