docker - 为 micronaut 应用程序构建 native 镜像

标签 docker kotlin micronaut graalvm graalvm-native-image

正如标题所示,我正在尝试使用 Docker 为基于 Kotlin 的 Micronaut 应用程序构建 native 镜像。

我已将以下依赖项添加到我的 build.gradle 文件中。

compileOnly 'org.graalvm.nativeimage:svm'
annotationProcessor 'io.micronaut:micronaut-graal'

我的 Dockerfile 如下所示。

FROM oracle/graalvm-ce:20.1.0-java11 as graalvm
RUN gu install native-image

WORKDIR /src
COPY . /src

RUN ./gradlew assemble
RUN native-image --no-server -cp build/libs/*-all.jar dk.fitfit.injurylog.Application

FROM frolvlad/alpine-glibc
RUN apk update && apk add libstdc++
COPY --from=graalvm /src/dk.fitfit.injurylog.application /app/app
ENTRYPOINT ["/app/app"]

一切似乎都井然有序。图像启动并似乎接受连接,但是当我发起 http 请求时,会发生以下错误。

11:38:52.033 [nioEventLoopGroup-1-2] ERROR i.m.h.s.netty.RoutingInBoundHandler - Unexpected error occurred: Failed to inject value for field [jacksonModules] of class: dk.fitfit.injurylog.util.CustomObjectMapperFactory

Message: Error setting field value: No field 'jacksonModules' found for type: io.micronaut.jackson.ObjectMapperFactory

io.micronaut.context.exceptions.DependencyInjectionException: Failed to inject value for field [jacksonModules] of class: dk.fitfit.injurylog.util.CustomObjectMapperFactory

Message: Error setting field value: No field 'jacksonModules' found for type: io.micronaut.jackson.ObjectMapperFactory

    at io.micronaut.context.AbstractBeanDefinition.injectBeanField(AbstractBeanDefinition.java:748)
    at dk.fitfit.injurylog.util.$CustomObjectMapperFactoryDefinition.injectBean(Unknown Source)
    at dk.fitfit.injurylog.util.$CustomObjectMapperFactoryDefinition.build(Unknown Source)
    at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1714)
    at io.micronaut.context.DefaultBeanContext.createAndRegisterSingletonInternal(DefaultBeanContext.java:2428)
    at io.micronaut.context.DefaultBeanContext.createAndRegisterSingleton(DefaultBeanContext.java:2414)
    at io.micronaut.context.DefaultBeanContext.getBeanForDefinition(DefaultBeanContext.java:2105)
    at io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:2079)
    at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1078)
    at dk.fitfit.injurylog.util.$CustomObjectMapperFactory$ObjectMapper1Definition.build(Unknown Source)
    at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1714)
    at io.micronaut.context.DefaultBeanContext.createAndRegisterSingletonInternal(DefaultBeanContext.java:2428)
    at io.micronaut.context.DefaultBeanContext.createAndRegisterSingleton(DefaultBeanContext.java:2414)
    at io.micronaut.context.DefaultBeanContext.getBeanForDefinition(DefaultBeanContext.java:2105)
    at io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:2079)
    at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:616)
    at io.micronaut.context.UnresolvedProvider.get(UnresolvedProvider.java:58)
    at io.micronaut.jackson.codec.JacksonMediaTypeCodec.getObjectMapper(JacksonMediaTypeCodec.java:105)
    at io.micronaut.jackson.codec.JacksonMediaTypeCodec.encode(JacksonMediaTypeCodec.java:212)
    at io.micronaut.jackson.codec.JacksonMediaTypeCodec.encode(JacksonMediaTypeCodec.java:221)
    at io.micronaut.http.server.netty.RoutingInBoundHandler.encodeBodyAsByteBuf(RoutingInBoundHandler.java:1405)
    at io.micronaut.http.server.netty.RoutingInBoundHandler.encodeBodyWithCodec(RoutingInBoundHandler.java:1351)
    at io.micronaut.http.server.netty.RoutingInBoundHandler.lambda$subscribeToResponsePublisher$12(RoutingInBoundHandler.java:1272)
    at io.reactivex.internal.operators.flowable.FlowableMap$MapSubscriber.onNext(FlowableMap.java:63)
    at io.micronaut.reactive.rxjava2.RxInstrumentedSubscriber.onNext(RxInstrumentedSubscriber.java:72)
    at io.reactivex.internal.operators.flowable.FlowableSubscribeOn$SubscribeOnSubscriber.onNext(FlowableSubscribeOn.java:97)
    at io.micronaut.reactive.rxjava2.RxInstrumentedSubscriber.onNext(RxInstrumentedSubscriber.java:72)
    at io.micronaut.http.context.ServerRequestTracingPublisher$1.lambda$onNext$1(ServerRequestTracingPublisher.java:60)
    at io.micronaut.http.context.ServerRequestContext.with(ServerRequestContext.java:68)
    at io.micronaut.http.context.ServerRequestTracingPublisher$1.onNext(ServerRequestTracingPublisher.java:60)
    at io.micronaut.http.context.ServerRequestTracingPublisher$1.onNext(ServerRequestTracingPublisher.java:52)
    at io.reactivex.internal.util.HalfSerializer.onNext(HalfSerializer.java:45)
    at io.reactivex.internal.subscribers.StrictSubscriber.onNext(StrictSubscriber.java:97)
    at io.micronaut.reactive.rxjava2.RxInstrumentedSubscriber.onNext(RxInstrumentedSubscriber.java:72)
    at io.reactivex.internal.operators.flowable.FlowableSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FlowableSwitchIfEmpty.java:59)
    at io.micronaut.reactive.rxjava2.RxInstrumentedSubscriber.onNext(RxInstrumentedSubscriber.java:67)
    at io.reactivex.internal.subscriptions.ScalarSubscription.request(ScalarSubscription.java:55)
    at io.reactivex.internal.subscriptions.SubscriptionArbiter.setSubscription(SubscriptionArbiter.java:99)
    at io.reactivex.internal.operators.flowable.FlowableSwitchIfEmpty$SwitchIfEmptySubscriber.onSubscribe(FlowableSwitchIfEmpty.java:51)
    at io.micronaut.reactive.rxjava2.RxInstrumentedSubscriber.onSubscribe(RxInstrumentedSubscriber.java:56)
    at io.reactivex.internal.operators.flowable.FlowableJust.subscribeActual(FlowableJust.java:34)
    at io.reactivex.Flowable.subscribe(Flowable.java:14935)
    at io.reactivex.Flowable.subscribe(Flowable.java:14882)
    at io.micronaut.reactive.rxjava2.RxInstrumentedFlowable.subscribeActual(RxInstrumentedFlowable.java:58)
    at io.reactivex.Flowable.subscribe(Flowable.java:14935)
    at io.reactivex.Flowable.subscribe(Flowable.java:14882)
    at io.reactivex.internal.operators.flowable.FlowableDefer.subscribeActual(FlowableDefer.java:42)
    at io.reactivex.Flowable.subscribe(Flowable.java:14935)
    at io.reactivex.Flowable.subscribe(Flowable.java:14882)
    at io.micronaut.reactive.rxjava2.RxInstrumentedFlowable.subscribeActual(RxInstrumentedFlowable.java:58)
    at io.reactivex.Flowable.subscribe(Flowable.java:14935)
    at io.reactivex.internal.operators.flowable.FlowableSwitchIfEmpty.subscribeActual(FlowableSwitchIfEmpty.java:32)
    at io.reactivex.Flowable.subscribe(Flowable.java:14935)
    at io.reactivex.Flowable.subscribe(Flowable.java:14882)
    at io.micronaut.reactive.rxjava2.RxInstrumentedFlowable.subscribeActual(RxInstrumentedFlowable.java:58)
    at io.reactivex.Flowable.subscribe(Flowable.java:14935)
    at io.reactivex.Flowable.subscribe(Flowable.java:14885)
    at io.micronaut.http.context.ServerRequestTracingPublisher.lambda$subscribe$0(ServerRequestTracingPublisher.java:52)
    at io.micronaut.http.context.ServerRequestContext.with(ServerRequestContext.java:68)
    at io.micronaut.http.context.ServerRequestTracingPublisher.subscribe(ServerRequestTracingPublisher.java:52)
    at io.reactivex.internal.operators.flowable.FlowableFromPublisher.subscribeActual(FlowableFromPublisher.java:29)
    at io.reactivex.Flowable.subscribe(Flowable.java:14935)
    at io.reactivex.Flowable.subscribe(Flowable.java:14882)
    at io.micronaut.reactive.rxjava2.RxInstrumentedFlowable.subscribeActual(RxInstrumentedFlowable.java:58)
    at io.reactivex.Flowable.subscribe(Flowable.java:14935)
    at io.reactivex.Flowable.subscribe(Flowable.java:14882)
    at io.reactivex.internal.operators.flowable.FlowableSubscribeOn$SubscribeOnSubscriber.run(FlowableSubscribeOn.java:82)
    at io.reactivex.internal.schedulers.ExecutorScheduler$ExecutorWorker$BooleanRunnable.run(ExecutorScheduler.java:288)
    at io.reactivex.internal.schedulers.ExecutorScheduler$ExecutorWorker.run(ExecutorScheduler.java:253)
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500)
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.lang.Thread.run(Thread.java:834)
    at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:517)
    at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:193)
Caused by: java.lang.NoSuchFieldError: No field 'jacksonModules' found for type: io.micronaut.jackson.ObjectMapperFactory
    at io.micronaut.core.reflect.ReflectionUtils.lambda$getRequiredField$2(ReflectionUtils.java:301)
    at java.util.Optional.orElseThrow(Optional.java:408)
    at io.micronaut.core.reflect.ReflectionUtils.getRequiredField(ReflectionUtils.java:301)
    at io.micronaut.context.DefaultFieldInjectionPoint.getField(DefaultFieldInjectionPoint.java:117)
    at io.micronaut.context.DefaultFieldInjectionPoint.set(DefaultFieldInjectionPoint.java:127)
    at io.micronaut.context.AbstractBeanDefinition.injectBeanField(AbstractBeanDefinition.java:742)
    ... 77 common frames omitted

关于如何避免上述错误的任何线索?

最佳答案

我未能使用 @Introspected 注释我的实体之一。

关于docker - 为 micronaut 应用程序构建 native 镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62102818/

相关文章:

docker - 为什么我不能使用Dockerfile访问容器,但是可以使用docker-compose访问容器?

docker - 我可以创建一个无法覆盖或删除文件和文件夹的 docker 卷吗?

list - 在 Kotlin 中将 map 转换为 map 列表

android - 使用 Retrofit2 和 Kotlin : Unable to create call adapter 在正文中发布数据

android - ViewModel没有零参数构造函数

java - 如何在使用 Micronaut 运行测试之前填充数据库

docker - 如何从 vscode 远程容器查看 docker 日志?

django - 如何构建docker镜像以引用venv中的python库

pagination - 使用 Pageable 进行分页的 Micronaut Controller

micronaut - 在 Micronaut 中绑定(bind) QueryValue 之前进行拦截