繁体   English   中英

Spring 启动 web 应用程序的 server.port 属性被 ZAEA23489CE3AA9B6406EBB28 上的 Docker 引擎忽略

[英]The server.port property of a Spring Boot web application is ignored by Docker Engine on Windows

TL;博士

The server.port property defined in a Spring Boot application.properties file is not getting honored by the Docker engine when running a web application in Tomcat.


背景:

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

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

Dockerfile:

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 启动应用程序。属性:

spring.application.name=my-web-app
server.port=8000
spring.jpa.show-sql=true
spring.h2.console.enabled=true

Docker 图像 output:

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

启动容器:

请注意,我将 map 我的Spring 引导application.properties文件的server.port到外部端口。

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

docker 容器 ls output:

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

我正在尝试使用以下方法访问 URL:

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

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

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

更新/编辑:

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

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

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

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

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

底线: Spring 引导application.properties 文件中定义的server.port属性未得到 Docker 引擎的认可。

docker 映像上的独立 tomcat 解决方案

server.port属性用于配置 spring 启动嵌入式服务器的端口。 在您的情况下,您正在尝试将带有应用程序的war文件部署到独立的 tomcat 服务器(包含在您的映像中)-因此甚至不使用嵌入式 spring 引导服务器,并且设置此属性无效。

要实现您想要的,您必须修改安装在映像上的 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

spring 启动 jar 的解决方案,嵌入式 tomcat 在 Z05B6053C41A2130AFD6FC3BEZB 容器中运行

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

docker container run -e SERVER_PORT=8000 -p 8000:8000 myimage

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM