JDK Docker 容器测试在 Ubuntu 18.04 失败怎么设置 docker 镜像参数排查【免费下载链接】jdkJDK main-line development https://openjdk.org/projects/jdk项目地址: https://gitcode.com/GitHub_Trending/jd/jdk在 OpenJDK 主开发仓库jdk中用make test跑 HotSpot 的 Docker 容器测试时如果你的宿主机是 Ubuntu 18.04x86测试可能会直接失败——同样的命令在 Ubuntu 16.04 上能通过。原因是默认 Docker 镜像里的 glibc 版本与宿主机不兼容文档举的例子是 Oracle Linux 7.6 for x86。解决方式不是改测试代码而是通过两个系统属性指定与宿主机匹配的 docker 镜像名和版本。本文基于 doc/testing.md 的 Docker Tests 一节和 DockerfileConfig.java 的默认值说明给出复现、修复和验证的完整路径。失败现象glibc 不兼容导致默认镜像跑不过doc/testing.md 明确记载Docker tests with default parameters may fail on systems with glibc versions not compatible with the one used in the default docker image。具体到 x86 上同一命令在 Ubuntu 16.04 上通过、在 Ubuntu 18.04 上失败。默认参数下运行 Docker 容器测试的命令是$ make test TESTjtreg:test/hotspot/jtreg/containers/docker这里的jtreg:test/hotspot/jtreg/containers/docker是一个完全限定的测试描述符指向 test/hotspot/jtreg/containers/docker/ 下的全部容器测试。如果失败运行结束时的测试汇总Test summary中TOTAL 与 PASS 不相等的行会被 ... 标记出来且make test以非零退出码结束。准备条件按 doc/testing.md 的说明运行这类测试需要满足已在本地构建过 JDKAssuming youve built the JDK locally测试通过 make 目标直接跑在构建产物上configure能找到 JTReg 框架自动发现即可否则用--with-jtregpath to jtreg home指向包含lib/jtreg.jar的 JTReg home 目录构建不是 ASAN 构建。Docker 容器测试如 DockerBasicTest.java带有requires container.support和requires !vm.asan即需要容器环境支持、且非 ASAN 构建才会执行。排查步骤一复现失败并确认是镜像问题先用默认参数复现$ make test TESTjtreg:test/hotspot/jtreg/containers/docker观察运行结束时的 Test summary如果 docker 测试对应的行出现FAIL或ERROR计数TOTAL ≠ PASS行首尾带 ... 标记且你的宿主机正是 Ubuntu 18.04 或类似 glibc 较新的系统就符合文档描述的场景。所有测试结果保存在build/$BUILD/test-results/$TEST_IDTEST_ID 是测试描述符的路径安全转换形式该路径也会打印在测试运行结束的日志里可用于进一步查看失败详情。排查步骤二用 JAVA_OPTIONS 指定 docker 镜像名和版本在 Ubuntu 18.04 上按文档给出的修复命令通过JTREG的JAVA_OPTIONS关键字传入两个系统属性jdk.test.docker.image.name和jdk.test.docker.image.version$ make test TESTjtreg:test/hotspot/jtreg/containers/docker \ JTREGJAVA_OPTIONS-Djdk.test.docker.image.nameubuntu -Djdk.test.docker.image.versionlatest两点用法说明均来自 doc/testing.md 的 Test suite control 一节JAVA_OPTIONS是 JTReg 的通用关键字其中的 Java 选项会作为-javaoption传给测试框架也就是测试进程读到的系统属性多个keywordvalue对用;分隔整个赋值建议写在引号内以保留空格和;。文档原样展示了上面这种多行写法续行后的空格会被保留直接照抄即可。这两个属性在测试库 DockerfileConfig.java 中被读取jdk.test.docker.image.name基础镜像名。未设置时按平台返回默认值——x86 默认ubuntuaarch64 默认arm64v8/ubuntuppc64le 默认ppc64le/ubuntus390x 默认s390x/ubuntujdk.test.docker.image.version镜像版本。未设置时默认latestPPC 平台除外因 Ubuntu 22.04 ppc 在 Power8 宿主机上会在libz inflateReset处崩溃PPC 默认固定为20.04。所以非 x86 架构的宿主机上出现同类失败时可以对照上表的默认镜像名把自己的镜像名和版本显式传进去。该文件的注释还特别提醒镜像版本不能是空字符串需要最新版本时用latest。DockerfileConfig 注释里还给出直接调用 jtreg 的等价方式属性直接以-D传给 jtreg$ jtreg -Djdk.test.docker.image.nameubuntu -Djdk.test.docker.image.versionlatest test/hotspot/jtreg/containers/docker/这是可选分支日常用上面的make test形式即可。结果验证修复后重跑用与复现时相同的方式判断是否解决运行结束看 Test summarydocker 容器测试这一行的 TOTAL 应等于 PASS不再出现 ... 标记和 FAIL/ERROR 计数make test返回退出码 0有失败时为非零如需核对单个用例去build/$BUILD/test-results/下对应 TEST_ID 目录查看路径在测试结束日志中打印。以 DockerBasicTest.java 为例测试自身会校验镜像内/jdk/bin/java -version以退出码 0 执行并包含 VM 名称、HelloDocker程序在容器内输出Hello Docker——这些是框架内部的断言你只需要以 summary 全 PASS 作为最终判断。边界与限制文档只说明 Ubuntu 18.04 上需要额外传镜像参数具体换成哪个镜像名和版本文档给出的示例是ubuntulatest其他取值例如针对特定架构或特定版本按 DockerfileConfig 的默认值表对照选取文档未给出更多组合示例。ASAN 构建下这些容器测试要求不满足会被跳过而非失败排查失败时先确认构建类型。测试失败时的失败处理器failure handler可能因sudo配置弹出密码提示可用--enable-jtreg-failure-handlerno关闭详见 doc/testing.md 的 Configuration 一节。【免费下载链接】jdkJDK main-line development https://openjdk.org/projects/jdk项目地址: https://gitcode.com/GitHub_Trending/jd/jdk创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考