我正在寻找将Java EE应用程序热部署到Docker容器中的可能性。
我发现最有趣的内容是通过"卷"在主机和容器之间共享tomcat目录的可能性。但它还不是一个热门的部署。
参考:https://groups.google.com/forum/#!topic/docker-user/b_4NRn9sLBQ
有关如何联系它的任何建议吗?
答案 0 :(得分:4)
我知道这个问题有点老了,但是我想分享一下我如何在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
添加日志似乎没什么大不了,但确实如此。启用此功能后,您可以立即看到部署的成功(或失败)。
丑陋的xml片段实际上非常重要。它使名为tomee
的用户具有部署应用程序的所有重要权限。
您可以使用普通的docker工具构建映像:
docker build -t tomee-dev .
我使用标准的Maven目录布局。这是一个示例:
pom.xml
src
|
- main
|
- java
| |
| - boundary
| |
| - TestResource.java
- webapp
|
- WEB-INF
|
- web.xml
这些文件的内容可以在此答案的底部找到。
像这样启动容器:
docker run -it --rm -p 8080:8080 tomee-dev
难题的最后一部分是我们的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>
您现在可以使用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();
}
}
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>
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>
答案 1 :(得分:0)
如果您将主机的卷以只读方式挂载到几个容器,请确保tomcat不会爆炸&#34;爆炸&#34;战争文件,至少不是同一个文件夹,那么我认为你有热部署,至少到tomcat级别可以支持。替换主机文件夹中的.war文件应触发重新部署。