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, приглашаю вас присоединиться к телеграм-каналу, посвященному этому фреймворку.
