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

Инструкции, изложенные в этой статье, не будут работать в 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.

От переводчика: если вам интересен Quarkus, приглашаю вас присоединиться к телеграм-каналу, посвященному этому фреймворку.