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

Windows上的Docker引擎忽略Spring Boot web应用程序的Server.Port属性

楚望
2023-03-14

DR

在Tomcat中运行web应用程序时,Docker引擎不会执行Spring Boot应用程序。properties文件中定义的server.port属性。

背景:

FROM tomcat
EXPOSE 8000
RUN rm -rf /user/local/tomcat/webapps/*
COPY ./target/my-web-app.war /usr/local/tomcat/webapps/ROOT.war
CMD ["catalina.sh","run"]
spring.application.name=my-web-app
server.port=8000
spring.jpa.show-sql=true
spring.h2.console.enabled=true
CK@Ping MINGW64 /c/Program Files/Docker Toolbox
$ docker images
REPOSITORY           TAG                  IMAGE ID            CREATED             SIZE
myrepo/my-web-app    0.0.1-SNAPSHOT       625e9d889139        4 minutes ago       694MB

启动容器:

请注意,我将Spring Bootapplication.properties文件的server.port映射到外部端口。

docker run -p 8000:8000 -d myrepo/my-web-app:0.0.1-SNAPSHOT

docker容器ls输出:

CONTAINER ID        IMAGE                                                COMMAND                  CREATED                  STATUS              PORTS                               NAMES
3eff09347de3      myrep/my-web-app:0.0.1-SNAPSHOT              "catalina.sh run"        Less than a second ago            Up 4 seconds        0.0.0.0:8000->8000/tcp, 8080/tcp    hardcore
This site can’t be reached
http://192.168.99.100:8000/my-web-app/getResults

当从Eclipse而不是Docker容器启动时,相同的应用程序工作得很好,我可以使用以下方法访问restendpoint:

http://localhost:8000/my-web-app/getResults

更新/编辑:

我找到了根本原因。我需要将端口8000映射到8080,而不是将8000映射到8000本身:

docker run -p 8000:8080 -d myrepo/my-web-app:0.0.1-SNAPSHOT

但是,如果我在Eclipse而不是Docker容器中运行相同的应用程序,tomcat将在server.port指定的端口上启动。

底线:在Spring Boot Application.properties文件中定义的server.port属性没有得到Docker引擎的支持。

共有1个答案

寿和通
2023-03-14

server.port属性用于配置spring boot嵌入式服务器的端口。在您的示例中,您试图将war文件与您的应用程序一起部署到独立的tomcat服务器(它包含在您的映像中)-因此,甚至没有使用嵌入式Spring Boot服务器,设置该属性也没有任何效果。

要实现所需的功能,必须修改映像上安装的tomcat的server.xml文件,并修改连接器端口。因此,您可以将重写的server.xml复制到您的映像中:

<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

  <Service name="Catalina">
    <!-- change port here-->
    <Connector port="8000" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

      </Host>
    </Engine>
  </Service>
</Server>

和dockerfile:

FROM tomcat:9.0
EXPOSE 8000

COPY ./target/my-web-app.war /usr/local/tomcat/webapps/ROOT.war

#override server.xml
COPY server.xml /usr/local/tomcat/conf/

CMD ["catalina.sh","run"]
docker run -p 8000:8000 -d myrepo/my-web-app:0.0.1-SNAPSHOT
docker container run -e SERVER_PORT=8000 -p 8000:8000 myimage
 类似资料:
  • 我正在将一个非常基本的web应用程序部署到Google应用程序引擎。我使用的是Springboot,我可以在本地很好地运行应用程序,但当我部署到Google时,应用程序引擎不会启动实例。我在启动时配置了一个云SQL数据源。 我有云sql配置属性配置src/main/Resources/application.properties.App Engine似乎找不到这些属性,所以它无法正确设置Cloud

  • 我正在读取google appengine应用程序中文件夹(/war/config/client.properties)中的属性文件。它在我的本地服务器上运行良好,但在生产模式下不工作,并且抛出异常java。安全AccessControlException:拒绝访问(java.io.FilePermission)。 你能告诉我如何在生产模式下工作吗。

  • 我们正在使用SpringSecurityACL基础设施与AppEngine数据存储相结合。我们不使用低级数据存储API,而是使用Objectify框架访问数据存储。我们需要将Spring SecurityACL模型(适用于RDBMS)转换为更适用于无模式面向对象数据存储的模型。到目前为止,我们已经完成了下面描述的两个实体。 国际计算语言学协会 id:Long 阿兰特里 sid:字符串 负责人:布尔

  • 我正试图从我的网站下载一个HTTPS页面,该页面由SNI托管在谷歌应用程序引擎上。无论我使用什么库,都会出现以下错误: 我尝试了多种方法来解决此错误,包括使用urllib3 openssl monkeypatch: 但是我总是得到上面提到的同样的错误。 有什么想法吗?

  • 如何配置我的应用程序引擎应用程序的内存(RAM)使用情况?我试图解决与超过实例内存限制相关的错误。我尝试过这些东西,到目前为止,它们不起作用或者不能提供我需要的东西。 Appstats。这不提供内存使用的详细信息 以上任何一点我都错了吗?在这个问题上,评分最高的答案(不是公认的答案)表示没有办法监控App Engine上的内存使用情况。那不可能是真的。可以吗? 编辑 我可以确认GAE mini p

  • 我正在寻找关于如何建立一个谷歌应用引擎项目的建议,该项目涉及多个模块,其中一个模块是GWT项目。我已经阅读了谷歌应用引擎模块文档(https://developers.google.com/appengine/docs/java/modules/)并在Stackoverflow上找到了一些帮助,比如本文使用appengine骨架原型发布GWT GAE应用程序引擎模块。然而,这涉及到很多东西,所以我