Micronaut:使用 Consul 依赖项构建原生图像不起作用
Micronaut: Build native image with Consul dependency does not work
我正在尝试构建 micronaut (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
有人知道问题出在哪里吗?
在浏览了几个问题和帖子后,我最终找到了答案。
要消除此故障,只需在您 Dockerfile
:
Docker 文件
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 中添加这个 class 应该是个好主意。使用 Micronaut CLI 生成新项目,发现原生镜像不改就不行,有点烦人。
我正在尝试构建 micronaut (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
有人知道问题出在哪里吗?
在浏览了几个问题和帖子后,我最终找到了答案。
要消除此故障,只需在您 Dockerfile
:
Docker 文件
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 中添加这个 class 应该是个好主意。使用 Micronaut CLI 生成新项目,发现原生镜像不改就不行,有点烦人。