[英]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 引擎的认可。
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 "%r" %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 复制到您的映像,您可以在容器启动期间设置SERVER_PORT
环境变量,以覆盖application.properties
中定义的属性:
docker container run -e SERVER_PORT=8000 -p 8000:8000 myimage
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.