Micronaut: не работает родной образ с зависимостью Consul - PullRequest
1 голос
/ 28 марта 2019

Я пытаюсь создать собственный образ приложения micronaut (v1.0.4).

Это приложение использует Consul в качестве службы обнаружения.

Я создал приложение, используя --features option:

$ 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)

Если я удаляю интеграцию с Консулом, она работает без проблем.

Я не смог найти ничего полезного в официальной документации:

Микросервисы как собственные изображения GraalVM

Консульская поддержка

Кто-нибудь знает, в чем проблема?

1 Ответ

0 голосов
/ 30 марта 2019

Пройдя несколько вопросов и постов, я в итоге нашел ответ.

Чтобы устранить эту ошибку, просто добавьте этот класс 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
...

После этого все работает нормально и образ докера успешно генерируется.

Хорошей идеей будет добавить этот класс в Dockerfile, сгенерированный по умолчанию. Немного раздражает создание нового проекта с использованием Micronaut CLI и обнаружение, что собственные изображения не работают без каких-либо изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...