在 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 的配置文件中(例如 |
Testcontainers 和 Quarkus Dev Services 还期望它们请求的容器服务是非交互式的。如果您的 Docker 或 Podman 配置中存在多个注册表,当拉取短名称指定的容器时,Podman 会响应一个提示,询问使用哪个注册表来拉取容器。
您可以通过在 /etc/containers/registries.conf
中将 Podman 的 short-name-mode
配置属性设置为 "disabled"
来禁用此提示。
此设置具有安全敏感性。在更改此设置之前,请参阅 Podman 中的容器镜像短名称。 |
最后,让我们启动 Podman 服务,使其监听之前由 DOCKER_HOST
环境变量指定的套接字。
Podman 在 apt
和 dnf
包管理器中附带了用户本地 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 的配置文件中(例如 |
Podman 现在可以响应 Testcontainers 中使用的 Java Docker 客户端。请注意,Quarkus Dev Services 要求 PATH
中存在 docker
命令。Linux 发行版上的 podman-docker
包为 Podman 提供了 Docker CLI 仿真层。
Quarkus 的未来版本将移除对 PATH
中 docker
命令的要求。
从 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"
此设置将在重启后生效。