TL;博士
在Tomcat中运行web应用程序时,Docker引擎不会使用Spring文件中定义的server.port属性。
背景:
我有一个简单的Spring应用程序,包含一个rest端点。我能够在Eclipse中运行这个应用程序,并从浏览器成功地访问rest端点。
但是,当我试图在Docker容器中部署相同的应用程序时,我无法从浏览器访问rest端点。
文档:
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 :
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 application.properties文件的application.properties映射到外部端口。
docker run -p 8000:8000 -d myrepo/my-web-app:0.0.1-SNAPSHOT码头容器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容器启动时,相同的应用程序工作得很好,我可以使用以下方法访问rest端点:
http://localhost:8000/my-web-app/getResultsUpdate/Edit:
我找到了根本原因。我需要将端口8000映射到8080,而不是将8000映射到8000本身:
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的遵守。
发布于 2020-05-23 12:06:12
码头图像中单机猫的解决方案
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>而码头文件:
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嵌入式tomcat在码头集装箱中运行的弹簧启动罐的解决方案
如果将弹簧引导jar复制到映像中,则可以在容器启动期间设置SERVER_PORT环境变量,以覆盖在application.properties中定义的属性:
docker container run -e SERVER_PORT=8000 -p 8000:8000 myimagehttps://stackoverflow.com/questions/61970142
复制相似问题