通过 Docker 启动 Ktor 应用程序会导致:未配置 Koin 上下文。请使用 startKoin 或 koinApplication DSL

Posted

技术标签:

【中文标题】通过 Docker 启动 Ktor 应用程序会导致:未配置 Koin 上下文。请使用 startKoin 或 koinApplication DSL【英文标题】:Launching Ktor app via Docker causes: No Koin Context configured. Please use startKoin or koinApplication DSL 【发布时间】:2021-06-07 16:03:36 【问题描述】:

我正在尝试在 Docker 中启动我的 Ktor 后端应用程序。但我在应用启动时有一个例外:

java.lang.IllegalStateException: No Koin Context configured. Please use startKoin or koinApplication DSL. 
        at org.koin.core.context.KoinContextHandler.getContext(KoinContextHandler.kt:29)
        at org.koin.core.context.KoinContextHandler.get(KoinContextHandler.kt:35)
        at org.koin.ktor.ext.KtorApplicationExtKt.getKoin(KtorApplicationExt.kt:34)
        at com.widgets.ApplicationKt$module$$inlined$inject$1.invoke(KtorApplicationExt.kt:77)
        at kotlin.UnsafeLazyImpl.getValue(Lazy.kt:81)
        at com.widgets.ApplicationKt$module$4.invoke(Application.kt:117)
        at com.widgets.ApplicationKt$module$4.invoke(Application.kt)
        at io.ktor.auth.Authentication.configure(Authentication.kt:77)
        at io.ktor.auth.Authentication$Feature.install(Authentication.kt:165)
        at io.ktor.auth.Authentication$Feature.install(Authentication.kt:148)
        at io.ktor.application.ApplicationFeatureKt.install(ApplicationFeature.kt:68)
        at com.widgets.ApplicationKt.module(Application.kt:116)
        at com.widgets.ApplicationKt.module$default(Application.kt:91)

这是我的应用程序代码:

fun main(args: Array<String>) 
    embeddedServer(Netty) 
        module 
            install(Koin) 
                modules(
                    module 
                        single<Logger>  BackendLogger() 
                    ,
                    ApiInjection.koinBeans
                    // ...
                )
            
            apiModule()
        
    .start(wait = true)


@kotlin.jvm.JvmOverloads
fun Application.apiModule() 
    val userApi by inject<UserApi>() // when this dependency used - I have a crash
    // ...


当我在本地启动我的应用程序 (Intellij Idea) 时,一切正常。那么为什么 Koin 安装不能正常工作呢?

【问题讨论】:

【参考方案1】:

经过长时间的研究,我终于找到了解决方案。

我将此行添加到build.gradle 文件中:

application 
    mainClassName = "com.mypackage.ApplicationKt"

我还编辑了resources/application.conf 文件:

    application 
        modules = [ com.mypackage ]
//        modules = [ com.mypackage.ApplicationKt.module ] // previous version
    

所以它对我有帮助!我希望它可以帮助你!

【讨论】:

以上是关于通过 Docker 启动 Ktor 应用程序会导致:未配置 Koin 上下文。请使用 startKoin 或 koinApplication DSL的主要内容,如果未能解决你的问题,请参考以下文章

链接 ktor 和 kotlinx.coroutines 会导致未定义的符号

在带有 Postgresql 数据库的 docker 容器中运行简单的 Kotlin Ktor 应用程序

如何在 Ktor 内部检查 Netty 是不是实际启动?

docker 启动 mysql,重启docker导致容器消失

Docker - Docker挂载mysql

Ktor 启动示例错误