Настройка Podman для Quarkus Dev Services и Testcontainers в Linux

Dec 6, 2021

Podman - это контейнерный движок без демонов (daemonless) для разработки, управления и запуска контейнеров в системах Linux. Начиная с выпуска версии 3, Podman позволяет пользователю запускать службу, имитирующую Docker API. Это позволяет использовать Testcontainers и Quarkus Dev Services вместе с Podman.

Это перевод статьи Configuring Podman for Quarkus Dev Services and Testcontainers on Linux, автор Michal Jurč.

Инструкции, изложенные в этой статье, не будут работать в MacOS и Microsoft Windows.

Требования

  • Linux система с установленным Podman 3.x
  • podman-docker, эмулирующий Docker CLI для Quarkus Dev Services
  • podman-remote установлен для этапа проверки (необязательно)

Конфигурация

TL;DR

Следующие команды настроят Podman и переменные среды для работы с Quarkus Dev Services и Testcontainers:

# Install the required podman packages from dnf. If you're not using rpm based
# distro, replace with respective package manager
sudo dnf install podman podman-docker
# Enable the podman socket with Docker REST API
systemctl --user enable podman.socket --now
# Set the required envvars
export DOCKER_HOST=unix:///run/user/${UID}/podman/podman.sock
export TESTCONTAINERS_RYUK_DISABLED=true

Ниже рассмотрим, что делает эта конфигурация, вместе с основными сведениями об устранении неполадок.

Настройка сервиса Podman

Podman - это контейнерный движок без демонов (daemonless). Quarkus Dev Services и Testcontainers ожидают, что запущенный демон Docker слушает Unix сокет. Начиная с версии 3, Podman можно настроить для создания службы, прослушивающей сокет Unix, и эту службу можно использовать с Dev Services и Testcontainers.

Клиенты Docker пытаются подключиться к службе, указанной в URL-адресе, заданном в переменной среды DOCKER_HOST, поэтому эту переменную необходимо настроить так, чтобы она указывала на сокет Unix, который будет прослушивать служба Podman:

export DOCKER_HOST=unix:///run/user/${UID}/podman/podman.sock

Этот параметр будет применяться только к текущему сеансу терминала. Чтобы сделать эту конфигурацию постоянной, добавьте строку в файлы профиля вашей оболочки (например, ~ /.profile).

Testcontainers и Quarkus Dev Services также ожидают, что служба контейнера, к которой они обращаются, будет неинтерактивной. Если в вашей конфигурации Docker или Podman настроено несколько реестров, Podman отвечает подсказкой, спрашивая, какой реестр следует использовать для извлечения контейнеров, если извлекаемые контейнеры указаны по короткому имени.

Вы можете отключить это приглашение, установив свойство конфигурации short-name-mode = "disabled" Podman в /etc/containers/registries.conf. Этот параметр может повлиять на безопасность системы. Пожалуйста, ознакомьтесь с краткими именами образов контейнеров в Podman перед изменением этого параметра.

Наконец, давайте запустим службу Podman, слушающую сокет, ранее указанный в переменной среды DOCKER_HOST.

Podman распространяется с локальными пользовательскими модулями systemd в менеджерах пакетов apt и dnf, настроенными для запуска службы Podman без root-доступа. Это означает, что процесс Podman будет запускаться только с привилегиями пользователя, под которым вы вошли в систему. Поэтому контейнеры и конфигурация хранятся в вашем домашнем каталоге и поэтому служба слушает unix:///run/user/${UID}/podman/podman.sock. В большинстве дистрибутивов Linux вы можете включить эту службу с помощью следующей команды:

systemctl --user enable podman.socket --now

Вы можете убедиться, что служба контейнера действительно работает и отвечает по URI, указанному в DOCKER_HOST, с помощью podman-remote:

podman-remote info

Поддержка подманом контейнера Ryuk в настоящее время нестабильна. Ryuk - это контейнер, который Testcontainers использует для очистки любых контейнеров после окончания их использования в Java-коде. Вы можете настроить Testcontainers, чтобы не использовать Ryuk:

export TESTCONTAINERS_RYUK_DISABLED=true

Этот параметр также будет применяться только к текущему сеансу терминала. Чтобы сделать эту конфигурацию постоянной, добавьте строку в файлы профиля вашей оболочки (например, ~ / .profile).

Теперь Podman готов отвечать клиенту Java Docker, используемому в Testcontainers. Обратите внимание, что для Quarkus Dev Services требуется, чтобы команда docker была доступна в PATH. Пакет podman-docker в дистрибутивах Linux предоставляет уровень эмуляции Docker CLI для Podman.

В будущих выпусках Quarkus необходимость в команде docker доступной в PATH, будет убрана.

Переход с Docker

Если вы ранее использовали версии Docker, которые не поддерживали cgroups V2 в современных дистрибутивах Linux, необходимо было использовать “костыль”, установив для cgroups значение V1. Это относилось к версиям Docker старше 19 включительно.

Вы можете проверить, применялся ли ранее в вашей системе этот костыль, с помощью следующей команды:

sudo grubby --info=ALL | grep "systemd.unified_cgroup_hierarchy=0"

Если вывод присутствует, это означает, что аргумент ядра для cgroups был установлен как V1. Вы можете удалить этот аргумент ядра с помощью следующей команды, повторно включив cgroups V2:

sudo grubby --update-kernel=ALL --remove-args="systemd.unified_cgroup_hierarchy=0"

Этот параметр вступит в силу только после перезагрузки.

Таким образом можно настроить Podman для Quarkus Dev Services и Testcontainers в Linux.