Spring引导应用程序独立运行良好,在docker中出现错误



我有一个基于spring-boot的java应用程序,它从命令行运行良好(嵌入式tomcat单机版)。

问题

当我在docker中运行该应用程序时,它无法正确运行。控制台显示应用程序启动良好,没有任何错误;但是,浏览器显示以下错误页面:

白标签错误页面

此应用程序没有/error的显式映射,因此您看到这是一个后备方案。

[我知道消息说没有'/error'url的映射。但是我想知道根本原因]

附加信息/上下文

  • 弹簧引导1.4.2
  • docker插件
  • 输出为"war"文件,该文件也独立运行
  • 我在"主机"网络模式下运行docker镜像(--net=host),这样它就可以访问数据库(mysql在我的本地主机上运行)

build.gradle目标

task buildDocker(type: Docker, dependsOn: build) {
push = false
applicationName = jar.baseName
dockerfile = file('src/main/docker/Dockerfile')
doFirst {
copy {
from war
into stageDir
}
}
}

码头文件

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD floss.war app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

命令运行Docker

dockerImg=1248c47d9cfa
docker run 
-it 
--net=host 
-e SPRING_APPLICATION_JSON="$SPRING_APPLICATION_JSON" 
$dockerImg

我是docker的新手,如果有任何建议,我将不胜感激。

提前感谢!

问题:

  1. dockerfile中没有暴露的端口
  2. 没有与主机的端口映射

Sol:1.在dockerfile中公开应用程序端口并构建映像 EXPOSE $application_port 2.然后运行 docker run -p 8080:8080 -d -e SPRING_APPLICATION_JSON="$SPRING_APPLICATION_JSON" $dockerImg

我遇到了同样的问题。对于Spring Boot,您似乎使用了与我相同的Docker示例。正如您所看到的,当WAR文件被放入Docker映像中时,它的扩展名是.jar,而不是.WAR.

我可以通过调用文件"app.war"而不是"app.jar"来解决这个问题,并相应地更改Java启动参数。

如果使用扩展名".jar",对静态资源的访问可以正常工作,但访问所有动态内容(JSP,…)会导致404错误。

我怀疑是因为缺少-p选项,你能试试吗。如果端口不同,请更改端口。docker run-p 8080:8080-它\--net=主机\-e SPRING_APPLICATION_JSON="$S普林G_APPLICITION_JSON"\$dockerImg

最新更新