Micronaut原生Docker镜像构建时出现logback-classic配置目录不存在的错误
看起来你遇到的问题是Docker构建过程中找不到logback-classic对应的配置目录,这大概率是Micronaut AOT生成的配置目录结构和Dockerfile里的复制路径不匹配导致的。我给你几个实用的排查和解决方向:
先检查本地生成的config-dirs结构
先看看项目构建后,build/docker/native-image/config-dirs(或者对应的输出目录)下有没有ch.qos.logback/logback-classic/1.4.9这个目录。如果本地都没生成这个目录,那Dockerfile里的复制指令肯定会失败。这种情况可以先禁用AOT配置里的replaceLogbackXml,看看能不能正常生成目录,或者手动确认下你项目里实际依赖的logback-classic版本是不是1.4.9。修正Dockerfile里的复制路径
如果本地确实有这个目录,但版本号和Dockerfile里写的不一致,那就把Dockerfile里的版本号改成你实际用的。也可以用通配符简化路径,比如把复制指令改成COPY --link config-dirs/ch.qos.logback/logback-classic/* /home/app/config-dirs/ch.qos.logback/logback-classic/,这样不管版本号是什么都能匹配到。调整Micronaut AOT配置
你开启了AOT里的replaceLogbackXml选项,这个功能会生成对应的配置目录,但有时候可能因为依赖版本冲突或者生成逻辑的问题导致目录缺失。可以先关掉这个选项,重新运行dockerfileNative任务,看看生成的Dockerfile是否还包含这些logback相关的目录操作;如果不需要这个优化就保持关闭,要是确实需要再仔细排查版本匹配的问题。强制重新生成配置文件
之前的任务都是UP-TO-DATE状态,缓存可能导致配置目录没正确更新。你可以先执行./gradlew clean清理缓存,再重新运行nativeCompile和dockerfileNative任务,确保所有配置文件和目录都是最新生成的。
另外,构建Docker镜像时可以加--no-cache参数强制不使用缓存,避免旧的错误路径影响构建:
docker buildx build --no-cache -f DockerfileNative -t micronaut-native:0.1 .
内容来源于stack exchange

