Micronaut:使用Consul依赖项构建本机映像不起作用

问题描述 投票:1回答:1

我正在尝试构建一个微型(v1.0.4)应用程序的原生图像。

此应用程序使用Consul作为服务发现。

我使用--features选项创建了应用程序:

$ mn create-app my-app --features discovery-consul --features graal-native-image --build maven

该应用程序在我的本地计算机上完美运行,但是当我尝试使用本机映像构建docker容器时,我收到错误:

$ ./docker-build.sh 
error: No instances are allowed in the image heap for a class that is initialized or reinitialized at image runtime: 
sun.security.provider.NativePRNG
Detailed message:
Error: No instances are allowed in the image heap for a class that is initialized or reinitialized at image runtime: sun.security.provider.NativePRNG
Trace:  object java.security.SecureRandom
    method com.sun.jndi.dns.DnsClient.query(DnsName, int, int, boolean, boolean)
Call path from entry point to com.sun.jndi.dns.DnsClient.query(DnsName, int, int, boolean, boolean): 
    at com.sun.jndi.dns.DnsClient.query(DnsClient.java:178)
    at com.sun.jndi.dns.Resolver.query(Resolver.java:81)
    at com.sun.jndi.dns.DnsContext.c_getAttributes(DnsContext.java:434)
    at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_getAttributes(ComponentDirContext.java:235)
    at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.getAttributes(PartialCompositeDirContext.java:141)
    at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.getAttributes(PartialCompositeDirContext.java:129)
    at javax.naming.directory.InitialDirContext.getAttributes(InitialDirContext.java:142)
    at io.micronaut.discovery.client.DnsResolver.getCNamesFromTxtRecord(DnsResolver.java:59)
    at io.micronaut.discovery.client.EndpointUtil.getEC2DiscoveryUrlsFromZone(EndpointUtil.java:197)
    at io.micronaut.discovery.client.EndpointUtil.getServiceUrlsFromDNS(EndpointUtil.java:141)

如果我删除Consul集成,它没有任何问题。

我在官方文档中找不到任何有用的东西:

Microservices as GraalVM native images

Consul Support

有谁知道问题在哪里?

java consul micronaut graalvm
1个回答
0
投票

经过几个问题和帖子,我最终找到了答案。

要删除此失败,只需在com.sun.jndi.dns.DnsClient中创建本机映像时,将此类--delay-class-initialization-to-runtime添加到选项Dockerfile下的类列表中:

Dockerfile

RUN native-image --no-server \
                 ...
                 --delay-class-initialization-to-runtime=...,com.sun.jndi.dns.DnsClient \
                 -H:-UseServiceLoaderFeature \
                 --allow-incomplete-classpath \
                 -H:Name=model-quotes \
                 -H:Class=model.quotes.Application
...

完成后,一切正常,Docker镜像生成成功。

在默认生成的Dockerfile中添加此类应该是个好主意。使用Micronaut CLI生成一个新项目并发现原生图像在不改变任何内容的情况下无法正常工作有点烦人。

© www.soinside.com 2019 - 2024. All rights reserved.