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

Podman と Quarkus の併用

Podman は、Linux システムや他の OS 上で OCI コンテナーを開発、管理、実行するためのデーモンレスかつルートレスのコンテナーエンジンです。Podman を Quarkus と一緒に使用する場合、一回限りのセットアップが必要ですが、一度セットアップすれば、Quarkus のすべての機能を利用することができます。

Podman のインストール

macOS

コンテナーは Linux そのものです。そのため、Linux コンテナーは macOS または Windows でネイティブに実行できません。したがって、コンテナーは Linux 仮想マシン (VM) で実行する必要があり、Podman クライアントはその仮想マシンと対話します。ネイティブのハイパーバイザーサブシステムと仮想化ソフトウェアを使用して、OS 上で Linux 仮想マシンを実行し、その仮想マシン内でコンテナーを実行します。Podman では、これは Podman マシンと呼ばれ、ツールに組み込まれています。

macOS ユーザーは Homebrew から Podman をインストールできます。brew をセットアップしたら、brew install コマンドを使用して Podman と docker-compose をインストールできます。

brew install podman
brew install docker-compose
podman machine init -v $HOME:$HOME
PODMAN_VERSION=`podman -v | sed 's/[a-zA-Z ]*//'`
sudo /opt/homebrew/Cellar/podman/$PODMAN_VERSION/bin/podman-mac-helper install
podman machine set --rootful
podman machine start
alias docker='podman'

Podman 4.1 以降を使用している場合、-v $HOME:$HOME のボリュームマウントは必要ありません。

Mac M1 を使用している場合、 AMD64 イメージを動作させる ための手順が追加で必要になります:

podman machine ssh
sudo -i
rpm-ostree install qemu-user-static
systemctl reboot

仮想マシンが再起動したら、Dev Services の実行が可能になるはずです。

詳しくはこちらをご覧ください。

Windows

セットアップや使用方法については、 Podman for Windows ガイド を参照してください。

Podman マシンを起動する前に、ルートフルコンテナー実行を優先するように設定します:

podman machine set --rootful

この操作は 1 回だけ実行します。

Linux

PodmanパッケージはいくつかのLinuxディストリビューションで利用可能です。 podman-docker`パッケージを使用するか、エイリアス(`alias docker=podman)を使用することで、Podmanはほとんどの場合、Dockerの代替品として使用することができます。 Linux OSにインストールするには、https://podman.io/getting-started/installation#installing-on-linux[Podmanインストールガイド]を参照してください。

Linux での DOCKER_HOST の設定

Podman は 2 つの操作モードをサポートしています。コンテナーがホストシステム上で root として動作するルートフルと、コンテナーが標準的な Unix ユーザーアカウントで動作するルートレスです。Linux では、REST API Unix ソケットは、デフォルトで root ユーザーしかアクセスできないように制限されています。これは、誰かがコンテナーを使ってシステム上で特権を昇格させることを防ぐためです。この制限を緩和して root だけでなく特別なグループを許可することもできますが、Linux でルートレス Podman を使用する方法が推奨されています。ルートレス Podman を使うには、DOCKER_HOST 環境変数を設定して、ユーザー専用のソケットを指すようにする必要があります。

どちらの場合も、systemdを通してPodmanソケットサービスを有効にするか、少なくともPodmanがサービスとして稼働しているようにして、REST APIを開始する必要があります。
# Example 1: Enable the podman socket with Docker REST API with systemd (only needs to be done once)
systemctl --user enable podman.socket --now
# Example 2: Enable the podman socket with Docker REST API on a system where systemd is not running (WSL etc)
podman system service --time=0

次に、以下のコマンドで、ソケットのパスを取得します。

$ podman info | grep -A2 'remoteSocket'

remoteSocket:
  exists: true
  path: /path/to/podman.sock

環境変数 DOCKER_HOST の設定は、毎回行うか、プロファイルに追加する必要があります。

export DOCKER_HOST=unix:///path/to/podman.sock (1)
1 /path/to/podman.sock を前に取得したパスに置き換えてください。

詳しい説明は、こちらの ブログ記事 を参照してください。

インストール後

テストコンテナー権限

~/.testcontainers.properties を編集し、以下の行を追加します。

ryuk.container.privileged=true

または、ryuk を無効にできます:

export TESTCONTAINERS_RYUK_DISABLED=true #not recommended - see above!

これには、 コンテナークリーンアップの無効化 が行われるという欠点があり、古くなったコンテナーがぶら下がる可能性があります。これは、自動テストを実行している場合に問題になることがあります。

イメージの略称

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

略称の使用は避けて、レジストリーを含め常に完全に指定された名前を使うことをお勧めしますが、残念ながら現時点で Testcontainers は内部的に略称に依存しています。もし Testcontainers を直接または Dev Services を通して使用している場合、/etc/containers/registries.conf で Podman の short-name-mode="disabled" 設定プロパティーを設定して、このプロンプトを無効にする必要があります。

関連コンテンツ