当前位置: 首页 > 知识库问答 >
问题:

使用mongodb和Java 11在Docker中运行的spring boot应用程序

储国发
2023-03-14

我正在docker容器中运行一个简单的spring引导应用程序。以下是我的规范:-spring boot 2.1.3.发行版-Java 11 with Windows 10-Docker use:FROM debian:strett-slim as packager-ENV jdk_version=“11.0.1”

spring boot simple applications可以很好地使用上述配置

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

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

o.s.b.web.embedded.Tomcat.tomcatstarter:启动Tomcat上下文时出错。异常:org.springframework.beans.factory.beancreationexception。消息:创建类路径资源[org/springframework/boot/actuate/autocigure/endpoint/web/servletendpointmanagementcontextconfiguration$webmvcservletendpointmanagementcontextconfiguration.class]中定义的名为“servlet endpointregistrar'”的bean时出错:通过工厂方法实例化bean失败;嵌套异常为org.springframework.beans.beanInstantiationException:无法实例化[org.springframework.boot.actuate.endpoint.web.ServletEndPointRegistrar]:工厂方法“servlet EndPointRegistrar'引发异常;嵌套异常为org.springframework.beans.factory.UnsatisfiedDependencyException:创建类路径资源[org/springframework/boot/actuate/autocconfigure/health/healthendpointconfiguration.class]中定义的名为“health endpoint”的bean时出错:通过方法“health endpoint”参数1表示的不满足的依赖关系;嵌套异常为org.springframework.beans.factor.beanCreationException:创建类路径资源[org/springframework/boot/actuate/autocigure/healt/healthdicatorautociguration.class]中定义的名为“health indicatorregistry”的bean时出错:通过工厂方法实例化bean失败;嵌套异常为org.springframework.beans.beanInstantiationException:无法实例化[org.springframework.boot.actuate.health.healthindicatorRegistry]:工厂方法“health indicatorRegistry”引发异常;嵌套异常为org.SpringFramework.Beans.Factory.UnsatisfiedDependencyException:创建名为“org.SpringFramework.Boot.Actuate.AutoConfigure.Mongo.MongoHealthIncatorAutoConfiguration”的bean时出错:通过构造函数参数0表示的未满足的依赖项;嵌套异常为org.springframework.beans.factory.unsatisfieddependencyException:创建类路径资源[org/springframework/boot/autocconfigure/data/mongo/mongodataautocconfiguration.class]中定义的名为“mongo template”的bean时出错:通过方法“mongo template”参数0表示的不满足的依赖关系;嵌套异常为org.springframework.beans.factory.beanCreationException:创建类路径资源[org/springframework/boot/autocconfigure/data/mongo/mongoDataautocconfiguration.class]中定义的名为“mongo dbfactory”的bean时出错:通过工厂方法实例化bean失败;嵌套异常为org.springframework.beans.beanInstantiationException:无法实例化[org.springframework.data.mongodb.core.mongodbfactorysupport]:工厂方法“mongo dbfactory”引发异常;嵌套异常为org.springframework.beans.factory.beanCreationException:创建类路径资源[org/springframework/boot/autociguration/mongo/mongoautociguration.class]中定义的名为'mongo'的bean时出错:通过工厂方法实例化bean失败;嵌套异常为org.springframework.beans.BeanInstantiationException:无法实例化[com.mongodb.mongoClient]:工厂方法“mongo”引发异常;嵌套异常是com.mongodb.mongoclientexception:无法创建用于解析SRV记录的JNDI上下文。“com.sun.jndi.dns.dns.dnsContextFactory”类在此JRE 2019-03-10 06:18:58.201中不可用----[main]O.s.Boot.SpringApplication:应用程序运行失败

null

原因:org.springframework.beans.factory.BeanCreationException:创建类路径资源[org/springframework/boot/autocconfigure/data/mongo/mongoDataautocconfiguration.class]中定义的名为“mongo dbfactory”的bean时出错:通过工厂方法实例化bean失败;嵌套异常为org.springframework.beans.beanInstantiationException:无法实例化[org.springframework.data.mongodb.core.mongodbfactorysupport]:工厂方法“mongo dbfactory”引发异常;嵌套异常为org.springframework.beans.factory.beanCreationException:创建类路径资源[org/springframework/boot/autociguration/mongo/mongoautociguration.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.factor.support.constructorresolver.instantiate(constructorresolver.java:627)~[spring-beans-5.1.5.release.jar!/:5.1.5.release]位于org.springframework.beans.factor.support.constructorresolver.instantiateusingfactorymethod(

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

我怀疑,spring boot是否完全支持npt Java 11,或者我缺少一些Java模块,我需要添加到我的DockerFile。

到目前为止,我已经将以下Java模块添加到我的DockerFile中:

--add-module\java.base,java.sql,java.naming,java.desktop,java.management,java.security.jgss,java.instrument

任何建议都会有帮助。

共有1个答案

吉岳
2023-03-14

我改变了Docker的图像,现在它工作得很好:

这里是Dockerfile,如果您想用Maven为Java 11设置Docker,它很有用。

null

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" ]
 类似资料:
  • 我试图在SpringMVC中运行SpringBoot应用程序,在SpringMVCPOM中添加SpringBoot应用程序依赖项,并扫描SpringBoot包,但我面临以下问题

  • 我有一个akka-http应用程序,在本地工作得很好,我有一些问题“dockerizing”应用程序。我通过Dockerfile构建docker映像,并使用docker-entrypoint执行java-jar命令。当我第一次访问正在运行的docker容器时,应用程序并没有运行,但是如果我访问容器并手动执行java-jar命令,应用程序就会启动良好。如果我执行以下命令(在容器内),应用程序也会正常

  • Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。 Hello world 现在让我们来试试 $ sudo docker run ubuntu:14.04 /bin/echo 'Hello world' Hello world 刚才你启动了你的第一个容器! 那么刚才发生了什么? 我们逐步来分析 docker run 命令做了哪些事情。 首先,

  • 其基本思想是运行带有音频和ui的应用程序(vlc、firefox、skype…) 我在使用pulseaudio搜索docker容器,但我找到的所有容器都在TCP上使用pulseaudio流。(应用程序的安全沙箱) https://gist.github.com/hybris42/ce429de428e5af3a344a https://github.com/jlund/docker-chrome-

  • 问题内容: 我有一个在码头上运行的Jetty应用程序。我想使用本地IntelliJ调试此应用程序。我使用的是14.1版,因此我已经安装了Docker Integration插件。 在“云”下,我使用的是单击“ +”时显示的默认值。IntelliJ文档说这应该没问题。在这里 我不确定它们的用途,所以我不知道这些值是否正确。 在运行/调试配置下,我正在使用Docker部署,以及以下值: 当我尝试运行此

  • 我有一个用Java 8编译的可执行jar文件,其中包含一个名为< code>app.jar的JavaFX应用程序。 当我安装了Java8时,我可以简单地用运行它。 现在我只安装了Java 11,运行上面的命令会产生以下错误: 因为Java 11不再包含JavaFX。 所以我考虑安装JavaFX。openjfx.org以两种形式提供JavaFx:SDK和JMOD文件。 我认为我不需要SDK,因为我不