【问题标题】:Spring Boot Application running inside Docker with mongodb and Java 11使用 mongodb 和 Java 11 在 Docker 中运行的 Spring Boot 应用程序
【发布时间】:2019-07-31 19:06:39
【问题描述】:

我在 docker 容器中运行一个简单的 spring-boot 应用程序。这是我的规格: - 春季启动 2.1.3.RELEASE - 带有 Windows 10 的 Java 11 - Docker 使用:FROM debian:stretch-slim 作为打包程序 - ENV JDK_VERSION="11.0.1"

Spring Boot 简单应用程序在上述配置下工作正常

当我添加 Mongodb (Spring data mongo) 并启动 spring boor 应用程序时,它在我的 windows 机器上运行良好,但是当我在 docker 容器中运行时,它抛出如下错误:

===============================================

o.s.b.web.embedded.tomcat.TomcatStarter:启动 Tomcat 上下文时出错。例外:org.springframework.beans.factory.BeanCreationException。消息:在类路径资源 [org/springframework/boot/actuate/autoconfigure/endpoint/web/ServletEndpointManagementContextConfiguration$WebMvcServletEndpointManagementContextConfiguration.class] 中创建名称为“servletEndpointRegistrar”的 bean 时出错:通过工厂方法实例化 bean 失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.boot.actuate.endpoint.web.ServletEndpointRegistrar]:工厂方法“servletEndpointRegistrar”抛出异常;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:在类路径资源 [org/springframework/boot/actuate/autoconfigure/health/HealthEndpointConfiguration.class] 中定义的名称为“healthEndpoint”的 bean 创建错误:通过方法表示的不满足的依赖关系“ healthEndpoint'参数1;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/actuate/autoconfigure/health/HealthIndicatorAutoConfiguration.class] 中定义名称为“healthIndicatorRegistry”的 bean 创建时出错:通过工厂方法进行 Bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.boot.actuate.health.HealthIndicatorRegistry]:工厂方法“healthIndicatorRegistry”抛出异常;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为 'org.springframework.boot.actuate.autoconfigure.mongo.MongoHealthIndicatorAutoConfiguration' 的 bean 时出错:通过构造函数参数 0 表示的不满足依赖关系;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:在类路径资源 [org/springframework/boot/autoconfigure/data/mongo/MongoDataAutoConfiguration.class] 中定义名称为“mongoTemplate”的 bean 创建错误:通过方法表示的不满足的依赖关系“ mongoTemplate'参数0;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/autoconfigure/data/mongo/MongoDataAutoConfiguration.class] 中定义名称为“mongoDbFactory”的 bean 创建时出错:通过工厂方法进行 Bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.data.mongodb.core.MongoDbFactorySupport]:工厂方法 'mongoDbFactory' 抛出异常;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/autoconfigure/mongo/MongoAutoConfiguration.class] 中定义名称为“mongo”的 bean 创建时出错:通过工厂方法进行 bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [com.mongodb.MongoClient]:工厂方法 'mongo' 抛出异常;嵌套异常是 com.mongodb.MongoClientException:无法创建用于解析 SRV 记录的 JNDI 上下文。 'com.sun.jndi.dns.DnsContextFactory' 类在此 JRE 中不可用 2019-03-10 06:18:58.201 错误 1 ​​--- [main] os.boot.SpringApplication:应用程序运行失败

org.springframework.context.ApplicationContextException:无法启动网络服务器;嵌套异常是 org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat 在 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:157) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543) ~[spring-context-5.1.5.RELEASE.jar!/:5.1.5.RELEASE] 在 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:316) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1260) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1248) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 com.eschoolo.EschooloCoreServiceApplication.main(EschooloCoreServiceApplication.java:24) ~[classes!/:0.0.1-SNAPSHOT] 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:na] 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:na] 在 java.base/java.lang.reflect.Method.invoke(未知来源)~[na:na] 在 org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) ~[eschoolo.jar:0.0.1-SNAPSHOT] 在 org.springframework.boot.loader.Launcher.launch(Launcher.java:87) ~[eschoolo.jar:0.0.1-SNAPSHOT] 在 org.springframework.boot.loader.Launcher.launch(Launcher.java:50) ~[eschoolo.jar:0.0.1-SNAPSHOT] 在 org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51) ~[eschoolo.jar:0.0.1-SNAPSHOT] 引起:org.springframework.boot.web.server.WebServerException:无法启动嵌入式Tomcat 在 org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:125) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.web.embedded.tomcat.TomcatWebServer.(TomcatWebServer.java:86) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:415) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:174) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:181) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:154) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] ...省略了16个常用框架 引起:org.springframework.beans.factory.BeanCreationException:在类路径资源[org/springframework/boot/actuate/autoconfigure/endpoint/web/ServletEndpointManagementContextConfiguration$WebMvcServletEndpointManagementContextConfiguration.class]中定义名称为“servletEndpointRegistrar”的bean创建错误:bean实例化通过工厂方法失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.boot.actuate.endpoint.web.ServletEndpointRegistrar]:工厂方法“servletEndpointRegistrar”抛出异常;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:在类路径资源 [org/springframework/boot/actuate/autoconfigure/health/HealthEndpointConfiguration.class] 中定义的名称为“healthEndpoint”的 bean 创建错误:通过方法表示的不满足的依赖关系“ healthEndpoint'参数1;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/actuate/autoconfigure/health/HealthIndicatorAutoConfiguration.class] 中定义名称为“healthIndicatorRegistry”的 bean 创建时出错:通过工厂方法进行 Bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.boot.actuate.health.HealthIndicatorRegistry]:工厂方法“healthIndicatorRegistry”抛出异常;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为 'org.springframework.boot.actuate.autoconfigure.mongo.MongoHealthIndicatorAutoConfiguration' 的 bean 时出错:通过构造函数参数 0 表示的不满足依赖关系;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:在类路径资源 [org/springframework/boot/autoconfigure/data/mongo/MongoDataAutoConfiguration.class] 中定义名称为“mongoTemplate”的 bean 创建错误:通过方法表示的不满足的依赖关系“ mongoTemplate'参数0;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/autoconfigure/data/mongo/MongoDataAutoConfiguration.class] 中定义名称为“mongoDbFactory”的 bean 创建时出错:通过工厂方法进行 Bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.data.mongodb.core.MongoDbFactorySupport]:工厂方法 'mongoDbFactory' 抛出异常;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/autoconfigure/mongo/MongoAutoConfiguration.class] 中定义名称为“mongo”的 bean 创建时出错:通过工厂方法进行 bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [com.mongodb.MongoClient]:工厂方法 'mongo' 抛出异常;嵌套异常是 com.mongodb.MongoClientException:无法创建用于解析 SRV 记录的 JNDI 上下文。 'com.sun.jndi.dns.DnsContextFactory' 类在此 JRE 中不可用 在 org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:627) ~[spring-beans-5.1.5.RELEASE.jar!/:5.1.5.RELEASE] 在 org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:607) ~[spring-beans-5.1.5.RELEASE.jar!/:5.1.5.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1305) ~[spring-beans-5.1.5.RELEASE.jar!/:5.1.5.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1144) ~[spring-beans-5.1.5.RELEASE.jar!/:5.1.5.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-5.1.5.RELEASE.jar!/:5.1.5.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.5.RELEASE.jar!/:5.1.5.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.5.RELEASE.jar!/:5.1.5.RELEASE] 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.5.RELEASE.jar!/:5.1.5.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.5.RELEASE.jar!/:5.1.5.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:204) ~[spring-beans-5.1.5.RELEASE.jar!/:5.1.5.RELEASE] 在 org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:235) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:226) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.web.servlet.ServletContextInitializerBeans.addServletContextInitializerBeans(ServletContextInitializerBeans.java:101) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.web.servlet.ServletContextInitializerBeans.(ServletContextInitializerBeans.java:88) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.getServletContextInitializerBeans(ServletWebServerApplicationContext.java:261) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.selfInitialize(ServletWebServerApplicationContext.java:234) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.web.embedded.tomcat.TomcatStarter.onStartup(TomcatStarter.java:54) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在

原因:org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/autoconfigure/data/mongo/MongoDataAutoConfiguration.class] 中定义名称为“mongoDbFactory”的 bean 创建错误:通过 bean 实例化工厂方法失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.data.mongodb.core.MongoDbFactorySupport]:工厂方法 'mongoDbFactory' 抛出异常;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/autoconfigure/mongo/MongoAutoConfiguration.class] 中定义名称为“mongo”的 bean 创建时出错:通过工厂方法进行 bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [com.mongodb.MongoClient]:工厂方法 'mongo' 抛出异常;嵌套异常是 com.mongodb.MongoClientException:无法创建用于解析 SRV 记录的 JNDI 上下文。 'com.sun.jndi.dns.DnsContextFactory' 类在此 JRE 中不可用 在 org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:627) ~[spring-beans-5.1.5.RELEASE.jar!/:5.1.5.RELEASE] 在 org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:607) ~[spring-beans-5.1.5.RELEASE.jar!/:5.1.5.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1305) ~

================================================ =========

我怀疑 Spring Boot 是否完全支持 Java 11,或者我缺少一些需要添加到 Dockerfile 中的 Java 模块。

到目前为止,我的 dockerfile 中添加了以下 java 模块:

--添加模块\ java.base,java.sql,java.naming,java.desktop,java.management,java.security.jgss,java.instrument

任何建议都会有所帮助。

【问题讨论】:

  • 不,这不是 Spring Boot 问题,而且——因为你说它适用于你的 Windows 10 环境,但不适用于 Docker 容器——我认为这也不是 MongoDB 问题。我的猜测是您的 Windows 机器上和 Docker 容器内有两个不同的 JRE。你能告诉我们是哪一个吗?
  • 是的。窗口机器我使用的是 Oracle jdk 11。在 Docker 容器中我使用的是 Openjdk 11.0.1。

标签: mongodb spring-boot dockerfile java-11


【解决方案1】:

我更改了 Docker 映像,现在它可以正常工作了:

这里是 Dockerfile,如果你想使用 maven 为 Java 11 设置 Docker,这很有用。

FROM openjdk:11-jdk-slim

ARG MAVEN_VERSION=3.6.0
ARG USER_HOME_DIR="/root"
ARG SHA=fae9c12b570c3ba18116a4e26ea524b29f7279c17cbaadc3326ca72927368924d9131d11b9e851b8dc9162228b6fdea955446be41207a5cfc61283dd8a561d2f
ARG BASE_URL=https://apache.osuosl.org/maven/maven-3/${MAVEN_VERSION}/binaries

RUN apt-get update && \
    apt-get install -y \
      curl procps \
  && rm -rf /var/lib/apt/lists/*

# Maven fails with 'Can't read cryptographic policy directory: unlimited'
# because it looks for $JAVA_HOME/conf/security/policy/unlimited but it is in
# /etc/java-9-openjdk/security/policy/unlimited
RUN ln -s /etc/java-11-openjdk /usr/lib/jvm/java-11-openjdk-$(dpkg --print-architecture)/conf

RUN mkdir -p /usr/share/maven /usr/share/maven/ref \
  && curl -fsSL -o /tmp/apache-maven.tar.gz ${BASE_URL}/apache-maven-${MAVEN_VERSION}-bin.tar.gz \
  && echo "${SHA}  /tmp/apache-maven.tar.gz" | sha512sum -c - \
  && tar -xzf /tmp/apache-maven.tar.gz -C /usr/share/maven --strip-components=1 \
  && rm -f /tmp/apache-maven.tar.gz \
  && ln -s /usr/share/maven/bin/mvn /usr/bin/mvn

ENV MAVEN_HOME /usr/share/maven
ENV MAVEN_CONFIG "$USER_HOME_DIR/.m2"

COPY mvn-entrypoint.sh /usr/local/bin/mvn-entrypoint.sh
COPY settings-docker.xml /usr/share/maven/ref/

ENTRYPOINT ["/usr/local/bin/mvn-entrypoint.sh"]
CMD ["mvn"]

CMD ["mvn", "clean","package","-Dmaven.test.skip=true"]

# COPY --from=packager "$JAVA_HOME" "$JAVA_HOME"
COPY "target/*.jar" "/myspringbootapp.jar"

EXPOSE 8080
CMD [ "-jar", "/myspringbootapp.jar" ]
ENTRYPOINT [ "java" ]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 2018-07-11
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 2019-05-13
    • 2018-10-04
    相关资源
    最近更新 更多