如何在Docker容器中热部署Java EE应用程序

我正在寻找将Java EE应用程序热部署到Docker容器中的可能性.

我发现最有趣的内容是通过“卷”共享主机和容器之间的tomcat目录的可能性.但它还不是一个热门的部署.

参考:https://groups.google.com/forum/#!topic/docker-user/b_4NRn9sLBQ

有关如何达到它的任何建议?

我知道这个问题有点老了,但我想分享一下如何用Docker中的tomee服务器开发java EE应用程序.

准备Docker镜像

首先要做的是启用日志记录.我使用官方基本映像并将日志重定向到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 /主/爪哇/边界/ 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 /主/ JAVA / web应用/ 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>

转载注明原文:如何在Docker容器中热部署Java EE应用程序 - 代码日志