将 WAR 部署到 tomcat docker 容器后总是得到 404
After deployment of WAR to tomcat docker container always getting 404
我有一个 grails 应用程序,它已经运行并通过 Tomcat8 Jre8 上的 Elastic Beanstalk 部署到 AWS。
我现在正尝试将它部署到多docker 环境中,但我的行为很奇怪。
我正在使用 tomcat:8.0-jre8
(https://hub.docker.com/r/library/tomcat/) 作为容器的镜像,在该镜像上的部署非常简单,只需将 war 文件放入 <tomcat_home>/webapps
.另外,我正在将端口 8080
映射到外部世界。因此,docker-compose 的相关部分如下所示:
api:
image: tomcat:8.0-jre8
container_name: api
volumes:
- ./deployment/api:/usr/local/tomcat/webapps
external_links:
- mysql:mysql
ports:
- "8080:8080"
根据日志,应用已成功部署,甚至正在应用 liquibase 迁移:
21-Nov-2016 07:11:03.671 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive /usr/local/tomcat/webapps/priz-0.5.war
21-Nov-2016 07:12:12.496 INFO [localhost-startStop-1] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
2016-11-21T07:13:38.397268676Z
Configuring Spring Security Core ...
... finished configuring Spring Security Core
2016-11-21T07:13:40.215275700Z
2016-11-21T07:13:40.777432843Z
Configuring Spring Security REST 2.0.0.M2...
... finished configuring Spring Security REST
2016-11-21T07:13:41.515464956Z
INFO 11/21/16 7:14 AM: liquibase: Successfully acquired change log lock
INFO 11/21/16 7:14 AM: liquibase: Reading from priz.DATABASECHANGELOG
INFO 11/21/16 7:14 AM: liquibase: Successfully released change log lock
21-Nov-2016 07:15:09.019 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive /usr/local/tomcat/webapps/priz-0.5.war has finished in 245,345 ms
21-Nov-2016 07:15:09.026 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-apr-8080"]
21-Nov-2016 07:15:09.036 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-apr-8009"]
21-Nov-2016 07:15:09.038 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 245425 ms
但是,当我尝试访问任何一个现有端点时,我收到 404 返回。
现在,同样根据日志,请求实际上是在访问服务器:
==> ./logs/localhost_access_log.2016-11-21.txt <==
172.17.0.1 - - [21/Nov/2016:07:15:09 +0000] "GET / HTTP/1.1" 404 -
172.17.0.1 - - [21/Nov/2016:07:15:09 +0000] "GET / HTTP/1.1" 404 -
172.17.0.1 - - [21/Nov/2016:07:16:45 +0000] "GET / HTTP/1.1" 404 -
172.17.0.1 - - [21/Nov/2016:07:17:01 +0000] "GET / HTTP/1.1" 404 -
172.17.0.1 - - [21/Nov/2016:07:17:07 +0000] "GET /index HTTP/1.1" 404 -
172.17.0.1 - - [21/Nov/2016:07:28:24 +0000] "GET /api/user/register HTTP/1.1" 404 -
172.17.0.1 - - [21/Nov/2016:07:28:46 +0000] "POST /api/user/register HTTP/1.1" 404 -
我该如何处理这个问题并进行调试?我错过了什么?
日志中没有什么特别的。
此外,我尝试了 tomcat 的不同版本,包括在 AWS EBS 上运行的版本。
另外,尝试通过 nginx 代理请求,结果相同。
您war的文件名是priz-0.5.war
。所以上下文名称也是priz-0.5
。
例如,您必须调用 http://localhost:8080/priz-0.5
如果您想像 http://localhost:8080/
那样调用它,只需将 war-文件重命名为 ROOT.war
我有一个 grails 应用程序,它已经运行并通过 Tomcat8 Jre8 上的 Elastic Beanstalk 部署到 AWS。
我现在正尝试将它部署到多docker 环境中,但我的行为很奇怪。
我正在使用 tomcat:8.0-jre8
(https://hub.docker.com/r/library/tomcat/) 作为容器的镜像,在该镜像上的部署非常简单,只需将 war 文件放入 <tomcat_home>/webapps
.另外,我正在将端口 8080
映射到外部世界。因此,docker-compose 的相关部分如下所示:
api:
image: tomcat:8.0-jre8
container_name: api
volumes:
- ./deployment/api:/usr/local/tomcat/webapps
external_links:
- mysql:mysql
ports:
- "8080:8080"
根据日志,应用已成功部署,甚至正在应用 liquibase 迁移:
21-Nov-2016 07:11:03.671 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive /usr/local/tomcat/webapps/priz-0.5.war
21-Nov-2016 07:12:12.496 INFO [localhost-startStop-1] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
2016-11-21T07:13:38.397268676Z
Configuring Spring Security Core ...
... finished configuring Spring Security Core
2016-11-21T07:13:40.215275700Z
2016-11-21T07:13:40.777432843Z
Configuring Spring Security REST 2.0.0.M2...
... finished configuring Spring Security REST
2016-11-21T07:13:41.515464956Z
INFO 11/21/16 7:14 AM: liquibase: Successfully acquired change log lock
INFO 11/21/16 7:14 AM: liquibase: Reading from priz.DATABASECHANGELOG
INFO 11/21/16 7:14 AM: liquibase: Successfully released change log lock
21-Nov-2016 07:15:09.019 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive /usr/local/tomcat/webapps/priz-0.5.war has finished in 245,345 ms
21-Nov-2016 07:15:09.026 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-apr-8080"]
21-Nov-2016 07:15:09.036 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-apr-8009"]
21-Nov-2016 07:15:09.038 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 245425 ms
但是,当我尝试访问任何一个现有端点时,我收到 404 返回。
现在,同样根据日志,请求实际上是在访问服务器:
==> ./logs/localhost_access_log.2016-11-21.txt <==
172.17.0.1 - - [21/Nov/2016:07:15:09 +0000] "GET / HTTP/1.1" 404 -
172.17.0.1 - - [21/Nov/2016:07:15:09 +0000] "GET / HTTP/1.1" 404 -
172.17.0.1 - - [21/Nov/2016:07:16:45 +0000] "GET / HTTP/1.1" 404 -
172.17.0.1 - - [21/Nov/2016:07:17:01 +0000] "GET / HTTP/1.1" 404 -
172.17.0.1 - - [21/Nov/2016:07:17:07 +0000] "GET /index HTTP/1.1" 404 -
172.17.0.1 - - [21/Nov/2016:07:28:24 +0000] "GET /api/user/register HTTP/1.1" 404 -
172.17.0.1 - - [21/Nov/2016:07:28:46 +0000] "POST /api/user/register HTTP/1.1" 404 -
我该如何处理这个问题并进行调试?我错过了什么? 日志中没有什么特别的。
此外,我尝试了 tomcat 的不同版本,包括在 AWS EBS 上运行的版本。 另外,尝试通过 nginx 代理请求,结果相同。
您war的文件名是priz-0.5.war
。所以上下文名称也是priz-0.5
。
例如,您必须调用 http://localhost:8080/priz-0.5
如果您想像 http://localhost:8080/
那样调用它,只需将 war-文件重命名为 ROOT.war