Quarkus の Testcontainers を Podman で動かす

概要

Quarkus で開発をする際に自動的に必要な Docker コンテナを立ち上げてくれますが Podman の Docker 互換 API で動かすこともできるとのことだったのでその覚え書きです。

環境

  • Fedora 39
  • OpenJDK 21 (Temurin 21.0.2)
  • Quarkus 3.7.4
  • Podman 4.9.3

セットアップ

Docker と異なり Podman は本来デーモン起動を必要としないのですが、これでは testcontainers を立ち上げられないため、 Docker 互換の API を提供する podman-docker をインストールして systemd サービスを起動しておきます。

nukosuke@fedora ~> sudo dnf install -y podman podman-docker podman-remote
nukosuke@fedora ~> systemctl --user enable podman.socket --now
nukosuke@fedora ~> podman info
  ...
  remoteSocket:
    exists: true
    path: /run/user/1000/podman/podman.sock
  ...

/run/user/1000/podman/podman.sock に sock ファイルが作成されていることが確認できます。ここでの 1000 はユーザの UID ですので適宜読み替えてください。( --user ではなく root 起動した場合は /run/podman/podman.sock)

# ~/.config/fish/config.fish
set -x TESTCONTAINERS_RYUK_DISABLED true

Quarkus 公式の記事では DOCKER_HOST 環境変数を指定する方法が紹介されていますが、何故か私の環境ではこれが無視され testcontainers が /run/docker.sock を探しにいってコンテナの起動に失敗するので、 .testcontainers.propertiesdocker.host を指定することで対処しました。

# ~/.testcontainers.properties
docker.host=docker.host=unix\:///run/user/1000/podman/podman.sock
ryuk.container.privileged=true

Quarkus プロジェクトに依存を追加する

この記事では Amazon DynamoDB を使用するために DynamoDB Enhanced Client の Quarkus extension を追加しています。この extension では LocalStack 経由で DynamoDB Local が立ち上がります。

// build.gradle
dependencies {
    // ...
    implementation enforcedPlatform("${quarkusPlatformGroupId}:quarkus-amazon-services-bom:${quarkusPlatformVersion}")
    implementation 'io.quarkiverse.amazonservices:quarkus-amazon-dynamodb-enhanced'
    // ...
}

これで開発に必要なコンテナイメージが自動的に pull & 起動されるようになりました。

nukosuke@fedora ~/w/g/n/quarkus-podman (work/setup)> ./gradlew quarkusDev

...

2024-02-24 23:14:59,003 INFO  [io.qua.ama.com.dep.DevServicesLocalStackProcessor] (build-38) Amazon Dev Services for localstack (dynamodb) started. Other Quarkus applications in dev mode will find the LocalStack automatically.
     __  ____  __  _____   ___  __ ____  ______ 
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
2024-02-24 23:14:59,970 INFO  [io.quarkus] (Quarkus Main Thread) platform 1.0.0-SNAPSHOT on JVM (powered by Quarkus 3.7.4) started in 8.039s. Listening on: http://localhost:8080

...

docker コマンドを叩いてみると、localstack コンテナが立ち上がっていることが確認できました。(実際に動いているのは podman ですが podman-docker パッケージに含まれる docker コマンドが docker CLI をエミュレートしています)

nukosuke@fedora ~/w/g/n/quarkus-podman (work/setup)> docker ps
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
CONTAINER ID  IMAGE                                  COMMAND     CREATED         STATUS                   PORTS                    NAMES
b4ef9a759761  docker.io/localstack/localstack:3.0.1              21 seconds ago  Up 21 seconds (healthy)  0.0.0.0:38403->4566/tcp  lucid_easley

参考

comments powered by Disqus