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