在 Linux 上为 Quarkus Dev Services 和 Testcontainers 配置 Podman

更新:关于运行 Podman 和 Quarkus 的最新、更简单的说明,请参阅 Quarkus Podman 指南

Podman 是一个无守护进程的容器引擎,用于在 Linux 系统上开发、管理和运行容器。自 3.0 版本发布以来,Podman 允许用户运行一个通过 Unix 套接字提供模拟 Docker API 的服务。这使得 Testcontainers 和 Quarkus Dev Services 可以与 Podman 一起使用。

本文中的操作指南在 macOS 和 Microsoft Windows 上不适用。

要求

  • 在安装了 Podman 3.x 的 Linux 系统上运行。

  • 安装了 podman-docker 以模拟 Quarkus Dev Services 的 Docker CLI。

  • (可选) 安装了 podman-remote 用于验证步骤。

配置

简而言之

以下命令将设置 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 是一个无守护进程的容器引擎。Quarkus Dev Services 和 Testcontainers 期望一个运行在 Unix 套接字上的 Docker 守护进程。自 3.0 版本起,Podman 可以配置为创建一个监听 Unix 套接字的守护进程,该守护进程可用于 Dev Services 和 Testcontainers。

根据约定,Docker 客户端会尝试连接到 DOCKER_HOST 环境变量中配置的 URL 指定的服务,因此需要配置此变量以指向 Podman 服务将监听的 Unix 套接字。

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

此设置仅对当前终端会话有效。要使此配置持久化,请将该行添加到您的 shell 的配置文件中(例如 ~/.profile)。

Testcontainers 和 Quarkus Dev Services 还期望它们请求的容器服务是非交互式的。如果您的 Docker 或 Podman 配置中存在多个注册表,当拉取短名称指定的容器时,Podman 会响应一个提示,询问使用哪个注册表来拉取容器。

您可以通过在 /etc/containers/registries.conf 中将 Podman 的 short-name-mode 配置属性设置为 "disabled" 来禁用此提示。

此设置具有安全敏感性。在更改此设置之前,请参阅 Podman 中的容器镜像短名称

最后,让我们启动 Podman 服务,使其监听之前由 DOCKER_HOST 环境变量指定的套接字。

Podman 在 aptdnf 包管理器中附带了用户本地 systemd 单元,这些单元配置为运行一个无根 Podman 服务。这意味着 Podman 进程将仅以您登录用户的权限启动,容器和配置存储在您的主目录中,并且该服务监听 unix:///run/user/${UID}/podman/podman.sock。在大多数 Linux 发行版中,您可以使用以下命令启用此服务:

systemctl --user enable podman.socket --now

您可以使用 podman-remote 来验证容器服务是否确实在运行,并在 DOCKER_HOST 指定的 URI 上响应。

podman-remote info

Podman 对 Ryuk 容器的支持目前不稳定。Ryuk 是 Testcontainers 用于在 Java 代码使用完毕后清理 Testcontainers 生成的所有容器的容器。您可以配置 Testcontainers 不使用 Ryuk。

export TESTCONTAINERS_RYUK_DISABLED=true

此设置仅对当前终端会话有效。要使此配置持久化,请将该行添加到您的 shell 的配置文件中(例如 ~/.profile)。

Podman 现在可以响应 Testcontainers 中使用的 Java Docker 客户端。请注意,Quarkus Dev Services 要求 PATH 中存在 docker 命令。Linux 发行版上的 podman-docker 包为 Podman 提供了 Docker CLI 仿真层。

Quarkus 的未来版本将移除对 PATHdocker 命令的要求。

从 Docker 迁移

如果您之前在不支持 cgroups V2 的现代 Linux 发行版上运行 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"

此设置将在重启后生效。