The English version of quarkus.io is the official project site. Translated sites are community supported on a best-effort basis.

LinuxでのQuarkus Dev ServicesとTestcontainersのためのPodmanの設定

Podmanは、Linuxシステム上でコンテナを開発、管理、実行するためのデーモンレスのコンテナエンジンです。バージョン3のリリース以降、PodmanはUnixソケット上で提供されるDocker APIをエミュレートするサービスを実行できるようになりました。これにより、TestcontainersやQuarkus Dev ServicesをPodmanで利用することができるようになりました。

この記事に記載されている方法は、macOSおよびMicrosoft Windowsでは使用できません。

要件

  • Podman 3.xがインストールされたLinuxシステム上であること

  • Quarkus Dev ServicesのDocker CLIをエミュレートするために podman-docker がインストールされていること

  • (オプション) 検証ステップのために podman-remote がインストールされていること

設定

詳細な説明

以下のコマンドは、Quarkus Dev ServicesとTestcontainersで動作するようにPodmanと環境変数をセットアップします。

# 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は、デーモンレスのコンテナエンジンです。QuarkusのDev ServicesとTestcontainersは、Unixソケットで待ち受ける稼働中のDockerデーモンを期待しています。バージョン3以降では、Unixソケットをリッスンするサービスを作成するようにPodmanを設定することができ、このサービスをDev ServicesやTestcontainersで使用することができます。

通常、Dockerクライアントは、 DOCKER_HOST 環境変数で設定されたURLで指定されたサービスに接続しようとするため、この変数は、PodmanサービスがリッスンするUnixソケットを指すように設定する必要があります。

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

この設定は、現在のターミナルセッションにのみ適用されます。この設定を持続させるには、シェルのプロファイルファイルにこの行を追加してください(例: ~/.profile )。

TestcontainersとQuarkus Dev Servicesも、リクエストするコンテナサービスが非インタラクティブであることを期待しています。DockerまたはPodmanの設定で複数のレジストリを構成している場合、Podmanは、pullするコンテナが短縮名で指定されている場合、どのレジストリを使ってコンテナを引き出すべきかを尋ねるプロンプトで応答します。

このプロンプトを無効にするには、 /etc/containers/registries.conf の Podman の設定プロパティに short-name-mode="disabled" を設定します。

この設定はセキュリティ上重要です。この設定を変更する前に、 Podmanのコンテナイメージ短縮名をご覧ください。

最後に、環境変数 DOCKER_HOST で指定したソケットをリッスンするPodmanサービスを起動してみましょう。

Podmanは、ルートレスのPodmanサービスを実行するように構成された aptdnf パッケージマネージャ上のユーザーローカルのsystemdユニットとともに配布されます。これは、ログインしているユーザーの権限でのみPodmanプロセスが起動し、コンテナと設定がホームディレクトリに保存され、このサービスが unix:///run/user/${UID}/podman/podman.sock をリッスンすることを意味します。ほとんどのLinuxディストリビューションでは、以下のコマンドでこのサービスを有効にすることができます。

systemctl --user enable podman.socket --now

DOCKER_HOST で指定した URI でコンテナサービスが実際に動作し、応答していることを podman-remote で確認することができます。

podman-remote info

PodmanのRyukコンテナのサポートは現在、不安定です。Ryukは、TestcontainersがJavaコードでの使用終了後に、Testcontainersによって生成されたコンテナをクリーンアップするために使用するコンテナです。Ryukを使用しないようにTestcontainersを設定することができます。

export TESTCONTAINERS_RYUK_DISABLED=true

この設定は、現在のターミナルセッションにのみ適用されます。この設定を持続させるには、シェルのプロファイルファイルにこの行を追加してください(例: ~/.profile )。

Testcontainersで使用されているJava Dockerクライアントに対応したPodmanが利用可能になりました。なお、Quarkus Dev Servicesでは、 docker コマンドが PATH で利用可能であることが必要です。Linuxディストリビューションの podman-docker パッケージは、Podman用のDocker CLIエミュレーションレイヤーを提供しています。

今後のQuarkusのリリースでは、 docker コマンドが PATH で利用できることへの依存がなくなる予定です。

Dockerからの移行

モダンなLinuxディストリビューションでcgroups V2をサポートしていないバージョンのDockerを実行していた場合、cgroupsをV1に設定する回避策を有効にする必要がありました。これは、19以前のDockerのバージョンが当てはまります。

回避策が以前にシステムに適用されているかどうかは、次のコマンドで確認できます。

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"

この設定は、再起動後にのみ有効になります。