wre*_*nzi 9 java tomcat docker
我正在寻找将Java EE应用程序热部署到Docker容器中的可能性.
我发现最有趣的内容是通过"卷"共享主机和容器之间的tomcat目录的可能性.但它还不是一个热门的部署.
参考:https://groups.google.com/forum/#!topic/docker- user/ b_4NRn9sLBQ
有关如何达到它的任何建议?
我知道这个问题有点老了,但是我想分享一下我如何在Docker中使用tomee服务器开发Java EE应用程序的知识。
首先要做的是启用日志记录。我使用官方基本映像并将日志重定向到stdout以便在控制台上查看它:
# you can change the base image of course
FROM tomee:8-jre-1.7.5-jaxrs
RUN ln -s /dev/stdout /usr/local/tomee/logs/catalina.out
RUN echo '<?xml version="1.0" encoding="utf-8"?><tomcat-users><role rolename="tomee-admin"/><user username="tomee" password="tomee" roles="tomee-admin,manager-gui,manager-script"/></tomcat-users>' > /usr/local/tomee/conf/tomcat-users.xml
Run Code Online (Sandbox Code Playgroud)
日志添加看起来似乎并不重要,但是确实如此。启用此功能后,您可以立即看到部署的成功(或失败)。丑陋的xml片段实际上非常重要。它使tomee具有所有重要权限的命名用户可以部署应用程序。
您可以使用普通的docker工具构建映像:
docker build -t tomee-dev .
Run Code Online (Sandbox Code Playgroud)
我使用标准的Maven目录布局。这是一个例子:
pom.xml
src
|
- main
|
- java
| |
| - boundary
| |
| - TestResource.java
- webapp
|
- WEB-INF
|
- web.xml
Run Code Online (Sandbox Code Playgroud)
这些文件的内容可以在此答案的底部找到。
像这样启动容器:
docker run -it --rm -p 8080:8080 tomee-dev
Run Code Online (Sandbox Code Playgroud)
最后一个难题是我们的Maven配置。您可以使用tomee maven插件进行重新部署
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<url>http://localhost:8080/manager/text</url>
<username>tomee</username>
<password>tomee</password>
<path>/${project.artifactId}</path>
</configuration>
</plugin>
</plugins>
</build>
Run Code Online (Sandbox Code Playgroud)
现在mvn clean tomcat7:deploy,您可以使用和mvn clean tomcat7:redeploy命令来部署/重新部署您的应用程序。
这是我在示例中使用的源文件和配置文件的内容:
src/main/java/boundary/TestResource.java
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;
@Path("/")
public class TestResource {
@GET
@Path("test")
public Response test1() {
return Response.ok("this is a test").build();
}
}
Run Code Online (Sandbox Code Playgroud)
src/main/java/webapp/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<module-name>hot-deploy</module-name>
<servlet>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/resources/*</url-pattern>
</servlet-mapping>
</web-app>
Run Code Online (Sandbox Code Playgroud)
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>hot-reload</artifactId>
<groupId>org.test.stackoverflow.answers</groupId>
<version>1.0.0-snapshot</version>
<packaging>war</packaging>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<tomee-plugin.pwd>tomee</tomee-plugin.pwd>
<tomee-plugin.user>tomee</tomee-plugin.user>
</properties>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<scope>provided</scope>
<version>7.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<url>http://localhost:8080/manager/text</url>
<username>tomee</username>
<password>tomee</password>
<path>/${project.artifactId}</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
Run Code Online (Sandbox Code Playgroud)
如果你将主机的卷以只读方式挂载到几个容器,确保tomcat不会“爆炸”war文件,至少不会到同一个文件夹,那么我认为你已经实现了热部署,至少达到了tomcat的水平可以支持。替换主机文件夹中的 .war 文件应该会触发重新部署。
| 归档时间: |
|
| 查看次数: |
2242 次 |
| 最近记录: |