用于运行glassfish服务器并从git存储库部署特定应用程序的dockerfile的内容

问题描述 投票:3回答:2

我正在尝试使用Glassfish 4.1服务器部署Java EE应用程序,并且希望将其部署为Docker容器。

我想编写正确的Docker命令来下载/启动Glassfish服务器,然后使用相应的GIT存储库在其上部署我的应用程序。

目前,我能够使用以下Dockerfile来启动Glassfish服务器来构建Docker容器:

FROM        java:8-jdk

ENV         JAVA_HOME         /usr/lib/jvm/java-8-openjdk-amd64
ENV         GLASSFISH_HOME    /usr/local/glassfish4
ENV         PATH              $PATH:$JAVA_HOME/bin:$GLASSFISH_HOME/bin

RUN         apt-get update && \
            apt-get install -y curl unzip zip inotify-tools && \
            rm -rf /var/lib/apt/lists/

RUN         curl -L -o /tmp/glassfish-4.1.zip http://download.java.net/glassfish/4.1/release/glassfish-4.1.zip && \
            unzip /tmp/glassfish-4.1.zip -d /usr/local && \
            rm -f /tmp/glassfish-4.1.zip

EXPOSE      8080 4848 8181

WORKDIR     /usr/local/glassfish4

# verbose causes the process to remain in the foreground so that docker can track it
CMD         asadmin start-domain --verbose

然后,我构建了Docker容器(名为“ myglassfish”)

docker build -t myglassfish .

最后,我使用以下命令行在8080端口上启动glassfish:

docker run -d -ti -p 4848:4848 -p 8080:8080 myglassfish

glassfish服务器已正确启动,因为我可以通过在浏览器中点击'localhost:8080'来看到以下信息:

'您的服务器正在运行...'(我无法显示屏幕截图)

现在,我希望将Web应用程序部署在该服务器上,最好使用项目的GIT存储库(首选解决方案)或应用程序的war文件导出。

让我们以最简单的示例为例,假设我想在服务器上部署名为myapp.war的战争(在路径/ path1 / path2 / myapp.war中)。下一个dockerfile是否正确(只需在dockerfile的末尾添加“ CMD asadmin deploy ...”)?

FROM        java:8-jdk

ENV         JAVA_HOME         /usr/lib/jvm/java-8-openjdk-amd64
ENV         GLASSFISH_HOME    /usr/local/glassfish4
ENV         PATH              $PATH:$JAVA_HOME/bin:$GLASSFISH_HOME/bin

RUN         apt-get update && \
            apt-get install -y curl unzip zip inotify-tools && \
            rm -rf /var/lib/apt/lists/*

RUN         curl -L -o /tmp/glassfish-4.1.zip http://download.java.net/glassfish/4.1/release/glassfish-4.1.zip && \
            unzip /tmp/glassfish-4.1.zip -d /usr/local && \
            rm -f /tmp/glassfish-4.1.zip

EXPOSE      8080 4848 8181

WORKDIR     /usr/local/glassfish4

# verbose causes the process to remain in the foreground so that docker can track it
CMD         asadmin start-domain --verbose
CMD         asadmin deploy /path1/path2/myapp.war

如果没有,在启动之前,我应该如何修改以前的Dockerfile以在Glassfish服务器中加载和部署我的应用程序(我指定我是linux和命令行指令中的菜鸟,所以请在您的回答中进行明确说明)?

编辑

现在,我可以使用以下Dockerfile从我的GIT存储库中部署我的war文件:

FROM        java:8-jdk

MAINTAINER  firstname name <[email protected]>

ENV         JAVA_HOME         /usr/lib/jvm/java-8-openjdk-amd64
ENV         GLASSFISH_HOME    /usr/local/glassfish4
ENV         PATH              $PATH:$JAVA_HOME/bin:$GLASSFISH_HOME/bin

RUN         apt-get update && \
            apt-get install -y curl unzip zip inotify-tools && \
            rm -rf /var/lib/apt/lists/

#download and install the glassfish server

RUN         curl -L -o /tmp/glassfish-4.1.zip http://download.java.net/glassfish/4.1/release/glassfish-4.1.zip && \
            unzip /tmp/glassfish-4.1.zip -d /usr/local && \
            rm -f /tmp/glassfish-4.1.zip

#clone and deploy the project on the glassfish server

RUN     git clone http://myrepository.git /usr/local/mypath
RUN     cp /usr/local/mypath/MyProject/MyProject.war /usr/local/glassfish4/glassfish/domains/domain1/autodeploy/MyProject.war

EXPOSE      8080 4848 8181

WORKDIR     /usr/local/glassfish4

# verbose causes the process to remain in the foreground so that docker can track it

CMD         asadmin start-domain --verbose

这很完美(使用docker build和docker run),但我想动态创建我的war文件,而不是直接在存储库中直接复制现有war文件。

我尝试通过命令行'jar -cvf'从存储库创建war存档,但是战争中缺少包含所有已编译的Java类.class的目录'classes'。结果,无法部署生成的war文件。由于在我的GIT存储库中不存在已编译的类.class,我该如何获取它们(我尝试了命令'javac',但大多数类未定义main方法)?具体来说,我只需要在WAR的目录“类”中添加所有已编译的类.class。我应该为此使用Maven存储库吗?

多谢!

git java-ee docker glassfish-4 dockerfile
2个回答
1
投票

(我认为最好的方法是创建一个新图像,该图像从您的“ myglassfish”图像扩展而来,并包含WAR文件。该图像将具有与应用程序的发行版本匹配的标签。我希望WAR文件已发布到Maven存储库,您可以在映像构建期间从中下载该文件。如果WAR文件在您的本地文件系统中,只需将其复制到映像中即可。最后一件事,万一您无法从计算机和boot2docker VM共享文件时,boot2docker会自动共享VM中的Users文件夹。希望对您有所帮助。如果您还有其他问题,请射击。


0
投票

您可以将包含Web应用程序(您的git项目)的本地目录作为volume装入容器。像:

docker run -d -ti -v your/project/folder:/path/to/webapp/directory -p 4848:4848 -p 8080:8080 myglassfish

那是为了开发时间。当您要发布它时,可以使用可以在ADD中使用的COPYDockerfile关键字将项目目录内容添加到图像。

您可以在volume documentation中找到更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.