首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >忽略Spring应用程序的server.port属性

忽略Spring应用程序的server.port属性
EN

Stack Overflow用户
提问于 2020-05-23 09:42:45
回答 1查看 1.7K关注 0票数 2

TL;博士

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

背景:

我有一个简单的Spring应用程序,包含一个rest端点。我能够在Eclipse中运行这个应用程序,并从浏览器成功地访问rest端点。

但是,当我试图在Docker容器中部署相同的应用程序时,我无法从浏览器访问rest端点。

文档:

代码语言:javascript
运行
复制
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 Boot application.properties :

代码语言:javascript
运行
复制
spring.application.name=my-web-app
server.port=8000
spring.jpa.show-sql=true
spring.h2.console.enabled=true

码头图像输出:

代码语言:javascript
运行
复制
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 application.properties文件的application.properties映射到外部端口。

代码语言:javascript
运行
复制
docker run -p 8000:8000 -d myrepo/my-web-app:0.0.1-SNAPSHOT

码头容器ls输出:

代码语言:javascript
运行
复制
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

浏览器中的错误:

代码语言:javascript
运行
复制
This site can’t be reached

我正在尝试使用:访问网址

代码语言:javascript
运行
复制
http://192.168.99.100:8000/my-web-app/getResults

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

代码语言:javascript
运行
复制
http://localhost:8000/my-web-app/getResults

Update/Edit:

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

代码语言:javascript
运行
复制
docker run -p 8000:8080 -d myrepo/my-web-app:0.0.1-SNAPSHOT

这意味着,在启动容器时,我在application.properties中定义的application.properties属性没有得到遵守。

更奇怪的是,例如,我可以将server.port设置为8111,如果使用-p 8000:8080,仍然能够访问-p 8000:8080

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

底线: --在Spring application.properties文件中定义的server.port属性--没有得到Docker的遵守。

EN

Stack Overflow用户

回答已采纳

发布于 2020-05-23 12:06:12

码头图像中单机猫的解决方案

server.port属性用于为spring引导嵌入式服务器配置端口。在您的示例中,您尝试使用应用程序将一个war文件部署到一个独立的tomcat服务器(包含在您的映像中)--因此甚至不使用嵌入式spring引导服务器,并且设置此属性没有任何效果。

要实现您想要的结果,您必须修改安装在映像上的tomcat的server.xml文件,并修改连接器端口。因此,您可以将覆盖的server.xml复制到您的图像中:

代码语言:javascript
运行
复制
<?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>

而码头文件:

代码语言:javascript
运行
复制
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"]

然后运行您的图像:

代码语言:javascript
运行
复制
docker run -p 8000:8000 -d myrepo/my-web-app:0.0.1-SNAPSHOT

嵌入式tomcat在码头集装箱中运行的弹簧启动罐的解决方案

如果将弹簧引导jar复制到映像中,则可以在容器启动期间设置SERVER_PORT环境变量,以覆盖在application.properties中定义的属性:

代码语言:javascript
运行
复制
docker container run -e SERVER_PORT=8000 -p 8000:8000 myimage
票数 5
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61970142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档