Keycloak Testcontainer 由于等待 URL 可访问超时而失败(http://localhost:55127/auth 应返回 HTTP 200)

Oma*_*oud 2 java spring-boot keycloak testcontainers

我正在使用 Mariadb 和 Keycloak 测试容器进行集成测试,但是,mariadb 容器启动,但 Keycloak 容器启动失败。我使用的是 MacBook Pro M1 和 jAVA 11

\n

代码

\n
public abstract class IntegrationTest {\n\npublic static KeycloakContainer keycloakContainer = new KeycloakContainer("jboss/keycloak:15.0.2")\n        .withRealmImportFile("/test_realm.json");\n\n@Autowired\npublic TransactionService transactionService;\n\n@Autowired\npublic PaymentService paymentService;\n\nObjectMapper mapper = new ObjectMapper()\n        .registerModule(new JavaTimeModule());;\n\n@LocalServerPort\nstatic int port = 8088;\n\nprotected static String authToken;\n\n@BeforeAll\npublic static void setUp() {\n    RestAssured.port = port;\n    RestAssured.baseURI = "http://localhost/";\n    RestAssured.enableLoggingOfRequestAndResponseIfValidationFails();\n\n    assertTrue(keycloakContainer.isRunning());\n\n    String authServer = keycloakContainer.getAuthServerUrl();\n    System.out.println("authServer: " + authServer);\n    authToken = getAccessToken();\n    System.out.println("authToken: " + authToken);\n}\n\n@DynamicPropertySource\nstatic void dynamicPropertySource(DynamicPropertyRegistry dynamicPropertyRegistry) {\n\n        MariaDBContainer<?> container = new MariaDBContainer<>("mariadb:10.6.4-focal")\n                .withDatabaseName("test")\n                .withUsername("test")\n                .withPassword("test");\n        dynamicPropertyRegistry.add("spring.datasource.url", container::getJdbcUrl);\n        dynamicPropertyRegistry.add("spring.datasource.username", container::getUsername);\n        dynamicPropertyRegistry.add("spring.datasource.password", container::getPassword);\n        dynamicPropertyRegistry.add("spring.datasource.driver-class", () -> "org.mariadb.jdbc.Driver");\n        dynamicPropertyRegistry.add("spring.jpa.database-platform", () -> "org.hibernate.dialect.MariaDBDialect");\n\n    dynamicPropertyRegistry.add("keycloak.auth-server-url", keycloakContainer::getAuthServerUrl);\n        container.start();\n    keycloakContainer.start();\n    System.out.println("Containers should be started.");\n}\n
Run Code Online (Sandbox Code Playgroud)\n

}

\n

IDE日志:

\n
\n

找到具有本地 Unix 套接字的 Docker 环境 (unix:///var/run/docker.sock)\nDocker 主机 IP 地址是 localhost\n连接到 docker:\n服务器版本: 20.10.10\nAPI 版本: 1.41\n操作系统: Docker桌面\n总内存:1988 MB\n图像名称替换将由以下方式执行:DefaultImageNameSubstitutor(\'ConfigurationFileImageNameSubstitutor\' 和 \'PrefixingImageNameSubstitutor\' 的组合)\nRyuk 已启动 - 将在 JVM 退出时监视并终止 Testcontainers 容器\n检查系统。 ..\n\xe2\x9c\x94\xef\xb8\x8e Docker 服务器版本应至少为 1.6.0\n\xe2\x9c\x94\xef\xb8\x8e Docker 环境应有超过 2GB 可用磁盘空间\n正在为图像创建容器:mariadb:10.6.4-focal\n正在启动 ID 为 4cb0ba7707f5cee202ae19aa177b7f2b7dbe5de93664263869935742e45c9f99\n容器 mariadb:10.6.4-focal 正在启动:4cb0ba7707f5cee2 02ae19aa177b7f2b7dbe5de93664263869935742e45c9f99\n等待数据库连接在 jdbc:mariadb://localhost 上可用: 55129/sympl 使用查询 \'SELECT 1\'\n容器已启动 (JDBC URL: jdbc:mariadb://localhost:55129/sympl)\n容器 mariadb:10.6.4-focal 在 PT5.679875S 中启动\n正在为映像创建容器: jboss/keycloak:15.0.2\n启动 ID 为 8c8792df10e2da254dd7fe200feeff4a2b756b989aec51897f6a6faca21a7403\n容器 jboss/keycloak:15.0.2 正在启动:8c8792df10e2da254dd7fe20 0feeff4a2b756b989aec51897f6a6faca21a7403\n/festive_bhabha: 等待 120 秒 URL: http://localhost:55131/auth (其中端口 55131 映射到容器端口 8080)

\n
\n

之后它尝试再次重新连接,并在超时完成后失败。

\n

来自 docker 的容器日志:

\n
\n

将“admin”添加到\n\'/opt/jboss/keycloak/standalone/configuration/keycloak-add-user.json\',\n重新启动服务器以加载用户

\n

使用嵌入式H2数据库

\n

=================================================== =======================

\n

=================================================== =======================

\n

JBoss 引导环境

\n

JBOSS_HOME:/opt/jboss/keycloak

\n

JAVA:java

\n

JAVA_OPTS: -server -Xms64m -Xmx512m -XX:MetaspaceSize=96M\n-XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless =true --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED --add-exports=jdk.unsupported/sun。反映=全部未命名

\n

=================================================== =======================

\n

05:28:07,243 INFO [org.jboss.modules](主要)JBoss 模块版本\n1.11.0.Final 05:28:09,744 INFO [org.jboss.msc](主要)JBoss MSC 版本 1.4.12.Final 05 :28:09,890 INFO [org.jboss.threads] (main)\nJBoss Threads 版本 2.4.0.Final 05:28:10,814 INFO [org.jboss.as]\n(MSC 服务线程 1-2) WFLYSRV0049: Keycloak 15.0.2 (WildFly Core\n15.0.1.Final) 开始 05:28:11,475 INFO [org.jboss.vfs] (MSC 服务线程 1-4) VFS000002: 无法清理临时文件\ntemp 类型提供程序的现有内容。启用调试级别日志以查找导致此问题的原因\n05:28:14,209 INFO [org.wildfly.security] (ServerService 线程池\n-- 20) ELY00001: WildFly Elytron 版本 1.15.3.Final 05:28:15,640 INFO [ org.jboss.as.controller.management-deprecated] (ServerService\n线程池 -- 11) WFLYCTL0033: 扩展 \'security\' 已弃用,\n未来版本可能不支持 05:28:16,882 INFO\n[org .jboss.as.controller.management-deprecated](控制器启动\n线程)WFLYCTL0028:资源中的属性\'security-realm\'位于\n地址\'/core-service=management/management-interface=http-interface\ '\nis 已弃用,并且可能会在未来版本中删除。请参阅读取资源描述操作的\n输出中的属性描述,了解有关弃用的详细信息。05:28:17,062 INFO\n[org.jboss.as.controller.management-deprecated] (ServerService Thread\nPool -- 23) WFLYCTL0028: 位于\naddress\n\'的资源中的属性\'security-realm\' /subsystem=undertow/server=default-server/https-listener=https\' 已被弃用,并且可能会在未来版本中删除。请参阅读取资源描述操作的输出中的属性描述,\n以了解有关弃用的详细信息。05:28:18,155 INFO\n[org.jboss.as.server](控制器启动线程)WFLYSRV0039:使用套接字绑定创建\nhttp管理服务(管理-http)\n05:28:18,290 INFO [org.xnio] (MSC服务线程1-2)XNIO版本\n3.8.4.Final 05:28:18,332 INFO [org.xnio.nio](MSC服务线程1-2)XNIO NIO实现版本3.8.4.Final 05:28: 18,589 INFO\n[org.wildfly.extension.health](ServerService 线程池 -- 36)\nWFLYHEALTH0001:激活基础运行状况子系统 05:28:18,664 INFO\n[org.jboss.as.clustering.infinispan](ServerService 线程池 -- 37)\nWFLYCLINF0001: 激活 Infinispan 子系统。05:28:18,689 INFO\n[org.jboss.as.security] (ServerService 线程池 -- 49) WFLYSEC0002:\n激活安全子系统 05:28:18,690 INFO [org.jboss.as.naming]\n(ServerService线程池 -- 46) WFLYNAM0001: 激活命名\n子系统 05:28:18,666 WARN [org.jboss.as.txn] (ServerService 线程\n池 -- 51) WFLYTX0013:\n/子系统上的节点标识符属性=交易设置为默认值。这对于运行多个服务器的环境来说是一个危险。请确保属性值是唯一的。\n 05:28:18,717 INFO [org.jboss.as.security]\n(MSC 服务线程 1-4)WFLYSEC0001:当前 PicketBox\n版本=5.0.3。Final-redhat-00007 05:28:18,816 INFO\n[org.wildfly.extension.metrics](ServerService 线程池 -- 45)\nWFLYMETRICS0001:激活基本指标子系统 05:28:18,826 INFO\n[org.jboss。 as.connector](MSC 服务线程 1-5)WFLYJCA0009:\n启动 Jakarta 连接器子系统(WildFly/IronJacamar\n1.4.27.Final)05:28:18,790 INFO [org.wildfly.extension.io](ServerService 线程池 - - 38) WFLYIO001: Worker\'默认\'已自动配置为 8 个 IO 线程,最大任务线程数为 64,基于您的\n4 个可用处理器 05:28:18,887 INFO [org.jboss.remoting] (MSC\n服务线程1-6) JBoss Remoting 版本 5.0.20.Final 05:28:19,009\nINFO [org.jboss.as.naming] (MSC 服务线程 1-1) WFLYNAM0003:\n启动命名服务 05:28:19,010 INFO\n [org.jboss.as.mail.extension](MSC 服务线程 1-3)WFLYMAIL0001:\n绑定邮件会话 [java:jboss/mail/Default] 05:28:19,357 INFO\n[org.wildfly.extension.undertow ] (MSC 服务线程 1-8) WFLYUT0003:\nUndertow 2.2.5.Final 开始 05:28:19,342 INFO\n[org.jboss.as.connector.subsystems.datasources] (ServerService 线程\n池 -- 31) WFLYJCA0004 : 部署符合 JDBC 的驱动程序类\norg.h2.Driver (版本 1.4) 05:28:19,398 INFO\n[org.jboss.as.connector.deployers.jdbc] (MSC 服务线程 1-8)\nWFLYJCA0018: 已启动驱动程序名称 = h2 的驱动程序服务 05:28:19,477\nINFO [org.jboss.as.jaxrs] (ServerService 线程池 -- 39)\nWFLYRS0016: RESTEasy 版本 3.15.1.Final 05:28:19,667 WARN\n [org.wildfly.clustering.web.undertow] (ServerService 线程池 --\n52) WFLYCLWEBUT0007: 找不到默认服务器的路由提供程序;\n使用基于静态配置的旧提供程序 05:28:20,323 INFO\n[org. jboss.as.ejb3](MSC 服务线程 1-8)WFLYEJB0481:严格池\nslsb-strict-max-pool 使用的最大实例大小为 64(每个类),\n这源自线程工作池大小。05:28:20,323 INFO\n[org.jboss.as.ejb3](MSC 服务线程 1-5)WFLYEJB0482:严格池\nmdb-strict-max-pool 使用的最大实例大小为 16(每个类), \n这是从该主机上的 CPU 数量得出的。05:28:20,527\nINFO [org.wildfly.extension.undertow] (ServerService 线程池 --\n52) WFLYUT0014: 使用选项为路径\n\'/opt/jboss/keycloak/welcome-content\' 创建文件处理程序[目录列表:\n\'false\',跟随符号链接:\'false\',区分大小写:\'true\',\n安全符号链接路径:\'[]\'] 05:28 :20,604 INFO\n[org.wildfly.extension.undertow] (MSC 服务线程 1-3) WFLYUT0012:\n已启动服务器默认服务器。05:28:20,615 WARN\n[org.wildfly.extension.elytron](MSC 服务线程 1-1)WFLYELY00023:\nKeyStore 文件\n\'/opt/jboss/keycloak/standalone/configuration/application.keystore\' \n不存在。已用空白。05:28:20,648 INFO\n[org.wildfly.extension.undertow](MSC 服务线程 1-3)正在排队\n请求。05:28:20,651 信息 [org.wildfly.extension.undertow](MSC\n服务线程 1-3)WFLYUT0018:主机默认主机开始\n05:28:20,669 警告 [org.wildfly.extension。elytron](MSC 服务线程\n1-1)WFLYELY01084:KeyStore\n/opt/jboss/keycloak/standalone/configuration/application.keystore 未\n找到,它将在首次使用自签名\n证书时自动生成主机本地主机警告:发生非法反射访问\n操作警告:\norg.wildfly.extension.elytron.SSLDefinitions\n(jar:file:/opt/jboss/keycloak/modules/system/layers/base/ 进行非法反射访问org/wildfly/extension/elytron/main/wildfly-elytron-integration-15.0.1.Final.jar!/)\n方法 com.sun.net.ssl.internal.ssl.Provider.isFIPS() 警告:\n请考虑将此问题报告给 \norg.wildfly.extension.elytron.SSLDefinitions 的维护者 警告:使用\n--illegal-access=warn 启用进一步非法反射访问操作的警告 警告:所有非法访问操作都将被\n拒绝未来版本 05:28:21,227 INFO\n[org.wildfly.extension.undertow] (MSC 服务线程 1-8) WFLYUT0006:\nUndertow HTTP 侦听器默认侦听 0.0.0.0:8080 05:28:23,000\nINFO [org .jboss.as.ejb3] (MSC 服务线程 1-7) WFLYEJB0493:\nJakarta Enterprise Beans 子系统暂停完成 05:28:23,843\nINFO [org.jboss.as.connector.subsystems.datasources] (MSC 服务\n线程 1 -8) WFLYJCA0001: 绑定数据源\n[java:jboss/datasources/KeycloakDS] 05:28:23,843 INFO\n[org.jboss.as.connector.subsystems.datasources] (MSC 服务线程\n1-5) WFLYJCA0001 :绑定数据源 [java:jboss/datasources/ExampleDS]\n05:28:24,110 INFO [org.jboss.as.patching](MSC 服务线程 1-4)\nWFLYPAT0050:Keycloak 累积补丁 ID 为:base、一-关闭补丁\n包括:无 05:28:24,192 WARN\n[org.jboss.as.domain.management.security](MSC 服务线程 1-3)\nWFLYDM0111:密钥库\n/opt/jboss/keycloak/standalone/配置/application.keystore 未找到,它将在第一次使用主机 localhost 05:28:24,286 INFO\n[org.jboss.as.server.deployment.scanner](MSC 服务)的自签名证书时自动生成线程 1-7)\nWFLYDS0013: 已为目录\n/opt/jboss/keycloak/standalone/deployments 05:28:24,309 INFO\n[org.jboss.as.server.deployment] 启动 FileSystemDeploymentService (MSC 服务线程 1-1 ) WFLYSRV0027:\n开始部署“keycloak-server.war”(运行时名称:\n“keycloak-server.war”)05:28:24,494 INFO\n[org.wildfly.extension.undertow](MSC 服务线程1-6) WFLYUT0006:\nUndertow HTTPS 侦听器 https 侦听 0.0.0.0:8443 05:28:28,673\nINFO [org.infinispan.CONTAINER] (ServerService 线程池 -- 54)\nISPN000128: Infinispan 版本: Infinispan \'Corona Extra\' 11.0.9.Final\n05:28:29,231 INFO [org.infinispan.CONFIG](MSC 服务线程 1-7)\nISPN000152:在未选择逐出策略的情况下配置钝化。只有手动逐出的实体才会被钝化。\n05:28:29,250 INFO [org.infinispan.CONFIG](MSC 服务线程 1-7)\nISPN000152:在未选择逐出策略的情况下配置钝化。\n 只有手动驱逐的实体才会被钝化。\n05:28:29, 578 信息 [org.infinispan.PERSISTENCE] (ServerService 线程\n池 -- 55) ISPN000556: 启动用户编组器\n\'org.wildfly.clustering.infinispan.marshalling.jboss.JBossMarshaller\'\n05:28:29,581 信息 [ org.infinispan.PERSISTENCE] (ServerService Thread\nPool -- 54) ISPN000556: 启动用户编组器\n\'org.wildfly.clustering.infinispan.spi.marshalling.InfinispanProtoStreamMarshaller\'\n05:28:30,523 INFO [org.jboss .as.clustering.infinispan] (ServerService\n线程池 -- 54) WFLYCLINF0002: 从 ejb 容器启动 http-remoting-connector\n缓存 05:28:30,675 INFO\n[org.jboss.as.clustering.infinispan] (ServerService线程池 -- 54)\nWFLYCLINF0002: 从 keycloak\ncontainer 05:28:30,675 INFO [org.jboss.as.clustering.infinispan]\n(ServerService 线程池 -- 58) WFLYCLINF0002: 启动actionTokens\n缓存启动offlineClientSessions缓存keycloak 容器 05:28:30,675 INFO\n[org.jboss.as.clustering.infinispan] (ServerService 线程池 -- 61)\nWFLYCLINF0002: 从 keycloak 容器 05:28:30,686\nINFO [org.jboss. as.clustering.infinispan] (ServerService 线程池\n-- 57) WFLYCLINF0002: 从 keycloak 容器启动会话缓存 05:28:30,675 INFO [org.jboss.as.clustering.infinispan] (ServerService\n线程池 -- 62) WFLYCLINF0002:从 keycloak 容器启动了authenticationSessions 缓存\n05:28:30,726 INFO\n[org.jboss.as.clustering.infinispan](ServerService 线程池 -- 59)\nWFLYCLINF0002:从 keycloak 容器启动了 loginFailures 缓存\n05:28: 30,726 信息 [org.jboss.as.clustering.infinispan] (ServerService\n线程池 -- 67) WFLYCLINF0002: 从\nkeycloak 容器启动 clientSessions 缓存 05:28:30,726 信息\n[org.jboss.as.clustering.infinispan] (ServerService 线程池 -- 66)\nWFLYCLINF0002: 从 keycloak 容器启动离线会话缓存\n05:28:30,953 INFO [org.jboss.as.clustering.infinispan] (ServerService\n线程池 -- 63) WFLYCLINF0002: 从以下位置启动用户缓存keycloak\ncontainer 05:28:30,953 INFO [org.jboss.as.clustering.infinispan]\n(ServerService 线程池 -- 60) WFLYCLINF0002: 从 keycloak 容器 05:28:30,956 INFO\n[org. jboss.as.clustering.infinispan] (ServerService 线程池 -- 65)\nWFLYCLINF0002: 从 keycloak 容器启动授权缓存\n05:28:30,959 INFO [org.jboss.as.clustering.infinispan] (ServerService\n线程池 -- 64) WFLYCLINF0002: 从 keycloak\ncontainer 05:28:31,726 开始密钥缓存 WARN [org.jboss.as.server.deployment] (MSC\n服务线程 1-7) WFLYSRV0273: 通过\njboss-deployment-struct 排除子系统 Web 服务。 xml 不存在。05:28:31,803 错误\n[io.undertow](MSC 服务线程 1-6)UT005024:无法为缓存资源管理器注册\n资源更改侦听器,缓存资源的自动\n验证将不起作用:\njava.lang。 RuntimeException:java.io.IOException:函数未在norg.jboss.xnio.nio@3.8.4.Final//org.xnio.nio.WatchServiceFileSystemWatcher实现。

\n

05:28:34,143 信息 [org.keycloak.services](ServerService 线程池\n-- 63)KC-SERVICES0001:从standalone.xml 或domain.xml 加载配置 05:28:34,422 警告[org.keycloak.common。配置文件]\n(ServerService 线程池 -- 63) 启用已弃用的功能:\nupload_scripts 05:28:34,423 警告 [org.keycloak.common.Profile]\n(ServerService 线程池 -- 63) 启用预览功能: 脚本\n05 :28:34,569 INFO [org.keycloak.url.DefaultHostnameProviderFactory]\n(ServerService 线程池 -- 63) 前端:,管理员:\n,后端:05:28:37,112 INFO\n[org.jboss.as.clustering .infinispan] (ServerService 线程池 -- 63)\nWFLYCLINF0002: 从 keycloak 容器启动realmRevisions 缓存\n05:28:37,162 INFO [org.jboss.as.clustering.infinispan] (ServerService\n线程池 -- 63) WFLYCLINF0002: 已启动userRevisions 缓存来自\nkeycloak 容器 05:28:37,209 INFO\n[org.jboss.as.clustering.infinispan] (ServerService 线程池 -- 63)\nWFLYCLINF0002: 已从 keycloak\n容器 05:28:37,214 INFO 启动authorizationRevisions 缓存\ n[org.keycloak.connections.infinispan.DefaultInfinispanConnectionProviderFactory]\n(ServerService 线程池 -- 63) 节点名称:8c8792df10e2,站点名称:\nnull

\n

Java 运行时环境检测到致命错误:

\n

SIGILL (0x4) 位于 pc=0x0000004016607605,pid=343,tid=466

\n

JRE 版本:OpenJDK 运行时环境 18.9 (11.0.12+7)(内部版本 11.0.12+7-LTS)\nJava VM:OpenJDK 64 位服务器 VM 18.9(11.0.12+7-LTS、混合模式、共享、分层) 、压缩oops、g1 gc、linux-amd64)\n有问题的帧:\nJ 5784 c1 liquibase.exception.ValidationErrors.checkRequiredField(Ljava/lang/String;Ljava/lang/Object;)V\n(120 字节) @ 0x0000004016607605\ n[0x00000040166075c0+0x0000000000000045]

\n

不会写入任何核心转储。核心转储已被禁用。要启用核心转储,请在启动 Java 之前尝试“ulimit -c unlimited” \n要启用核心转储,请在再次

\n

包含更多信息的错误报告文件保存为:\n/tmp/hs_err_pid343.log 编译方法 (c1) 35858 6315 2 liquibase.sqlgenerator.core.CreateSequenceGenerator::validate (169\nbytes) 堆中总计 [0x00000040166ecb90,0x00000040166ee598] = 6664\n重定位 [0x00000040166ecd08,0x00000040166ece38] = 304 主\n代码 [0x00000040166ece40,0x00000040166ee0a0] = 4704 存根代码\n[0x00000040166ee0a0,0
x00000040166ee130] = 144 oops \n[0x00000040166ee130,0x00000040166ee160
] = 48 个元数据
\n[0x00000040166ee160,0x00000040166ee178] = 24 个范围数据
\n[0x00000040166ee178,0x00000040166ee2a8] = 304 个范围 pcs
\n[0x00000040166ee2a8,0x00000040166ee528] = 640 个依赖项
] = 640 个依赖项 \n[0x00000040166ee528,0x 00000040166ee530] = 8 nul chk 表\n[0x00000040166ee530,0x00000040166ee598] = 104 无法加载\ nhsdis-amd64.so;库无法加载;PrintAssembly 已禁用

\n

如果您想提交错误报告,请访问:\n https://bugzilla.redhat.com/enter_bug.cgi?product=Red%20Hat%20Enterprise%20Linux%208&component=java-11-openjdk \nqemu: uncaught目标信号 6(中止)- 核心已转储\n*** JBossAS 进程 (343) 收到 ABRT 信号 ***

\n
\n

但是,当我启动 keycloack 容器并 setExposedPort(8080) 时

\n
keycloakContainer.setExposedPorts(List.of(8080));\nkeycloakContainer.start();\n
Run Code Online (Sandbox Code Playgroud)\n

容器日志不会引发 JVM 错误。这里的日志是暴露 8080 端口后的

\n

rie*_*pil 5

这些jboss/keycloak图像仅支持linux/amd64架构。查看Docker Hub 内的标签。

对于您的 M1,您拥有arm64官方 Keycloak 映像不支持的处理器。通过 Apple 的 Rosetta 2 模拟,Apple 尽最大努力使amd64映像正常工作,但您的 Keycloak 容器在启动过程中失败:

Java 运行时环境检测到致命错误:SIGILL (0x4) at pc=0x0000004016607605、pid=343、tid=466

您可以使用支持以下功能的社区构建arm64

public static KeycloakContainer keycloakContainer = 
    new KeycloakContainer("mihaibob/keycloak:14.0.0")
            .withRealmImportFile("/test_realm.json");
Run Code Online (Sandbox Code Playgroud)

您还应该能够在本地构建自己的arm64兼容 Keycloak Docker 镜像。