是否可以在Java测试中使用带有Podman的测试容器?截至2022年3月,Testcontainers库无法将已安装的Podman检测为有效的Docker环境。
Podman可以用苹果硅(本地开发环境)和Linux x86_64 (CI/CD环境)替代x86_64吗?
发布于 2022-03-20 19:12:52
在Java项目中,可以将Podman与测试容器一起使用,这些项目使用的是Linux和MacOS上的Gradle ( x86_64和Apple )。
先决条件
启用Podman服务
Testcontainers库使用套接字文件与Podman通信。
Linux
为常规用户(无根)启动Podman服务,并使其侦听套接字:
systemctl --user enable --now podman.socket检查Podman服务状态:
systemctl --user status podman.socket检查套接字文件是否存在:
ls -la /run/user/$UID/podman/podman.sockMacOS
Podman套接字文件/run/user/1000/podman/podman.sock可以在Podman管理的Linux中找到。可以使用SSH隧道将MacOS上的本地套接字转发到Podman管理的VM上的远程套接字。
可以使用命令podman system connection list --format=json找到Podman管理的VM的端口。
安装jq解析JSON:
brew install jq创建外壳别名,将本地套接字/tmp/podman.sock转发到远程套接字/run/user/1000/podman/podman.sock。
echo "alias podman-sock=\"rm -f /tmp/podman.sock && ssh -i ~/.ssh/podman-machine-default -p \$(podman system connection list --format=json | jq '.[0].URI' | sed -E 's|.+://.+@.+:([[:digit:]]+)/.+|\1|') -L'/tmp/podman.sock:/run/user/1000/podman/podman.sock' -N core@localhost\"" >> ~/.zprofile
source ~/.zprofile打开SSH隧道:
podman-sock在使用Testcontainers执行测试之前,确保SSH隧道是打开的。
配置Gradle构建脚本
build.gradle
test {
OperatingSystem os = DefaultNativePlatform.currentOperatingSystem;
if (os.isLinux()) {
def uid = ["id", "-u"].execute().text.trim()
environment "DOCKER_HOST", "unix:///run/user/$uid/podman/podman.sock"
} else if (os.isMacOsX()) {
environment "DOCKER_HOST", "unix:///tmp/podman.sock"
}
environment "TESTCONTAINERS_RYUK_DISABLED", "true"
}根据操作系统将DOCKER_HOST环境变量设置为Podman文件。
使用环境变量TESTCONTAINERS_RYUK_DISABLED禁用Ryuk。
莫比·罗克帮助您在指定延迟后通过给定的过滤器删除容器/网络/卷/图像。
Ryuk是一种码头技术,不支持Podman。请参阅测试容器/moby-ryuk#23
Testcontainers库使用Ruyk删除容器。我们将不依赖Ryuk隐式删除容器,而是使用JVM关机钩子显式地删除容器:
Runtime.getRuntime().addShutdownHook(new Thread(container::stop));传递环境变量
作为在Gradle构建脚本中配置测试容器的替代方法,您可以将环境变量传递给Gradle。
Linux
DOCKER_HOST="unix:///run/user/$UID/podman/podman.sock" \
TESTCONTAINERS_RYUK_DISABLED="true" \
./gradlew clean build -iMacOS
DOCKER_HOST="unix:///tmp/podman.sock" \
TESTCONTAINERS_RYUK_DISABLED="true" \
./gradlew clean build -i全例
请参阅完整的示例https://github.com/evgeniy-khist/podman-testcontainers
发布于 2022-03-20 20:13:54
对于Linux,即使官方的测试容器文档并不十分清楚,它也肯定能工作。
# Enable socket
systemctl --user enable podman.socket --now
# Export env var expected by Testcontainers
export DOCKER_HOST=unix:///run/user/${UID}/podman/podman.sock
export TESTCONTAINERS_RYUK_DISABLED=true资料来源:
发布于 2022-04-25 17:43:45
我能够建立在叶夫吉尼出色的回答之上,因为从最初的答案开始,波德曼在时间上得到了改善。在Mac上,这些步骤对我来说已经足够了,并使测试容器感到高兴:
编辑~/.testcontainers.properties并添加以下行
ryuk.container.privileged=true然后运行以下命令
brew install podman
podman machine init
sudo /opt/homebrew/Cellar/podman/4.0.3/bin/podman-mac-helper install
podman machine set --rootful
podman machine start如果您不想运行rootful podman,ryuk需要禁用:
export TESTCONTAINERS_RYUK_DISABLED="true"在没有ryuk的情况下运行基本上是有效的,但是滞留的容器有时会在自动化测试中引起问题和名称冲突。Evginiy关于关闭钩子的建议可以解决这个问题,但是需要修改代码。
https://stackoverflow.com/questions/71549856
复制相似问题