dockerfile的内容来运行glassfish服务器,并从git仓库部署特定的应用程序

我正在尝试使用glassfish 4.1服务器部署我的java ee应用程序,并且我想将其部署为Docker容器。

因此,我想编写一个正确的docker来下载/启动一个glassfish服务器,然后使用相应的GIT存储库部署我的应用程序。

目前,我能够使用以下Dockerfile构build一个启动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 

然后,我构buildDocker容器(名为“myglassfish”)

 docker build -t myglassfish . 

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

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

glassfish服务器正确启动,因为我可以通过在我的浏览器上录制“localhost:8080”来看到以下信息:

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

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

假设我想在我的服务器上部署名为myapp.war的战争(在path/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服务器之前启动它(我指定我是一个noob在Linux和命令行指令,所以请明确在您的答案)?

编辑

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

 FROM java:8-jdk MAINTAINER firstname name <firstname.name@domain.com> 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 

这完美的作品(使用dockerbuild设和docker运行),但我想dynamic创build我的战争文件,而不是直接复制我的存储库中的现有战争文件。

我尝试了命令行“jar -cvf”从存储库创build战争档案,但包含所有已编译的java类.class的目录“classes”在战争中不见了。 因此,生成的战争文件无法部署。 由于编译的类.class没有出现在我的GIT仓库中,我怎样才能得到它们(我尝试了命令'javac',但大多数的类没有定义一个主要的方法)? 具体来说,我只需要在我的WAR目录的“classes”中添加所有编译的类.class。 我应该使用一个Maven仓库吗?

感谢提前!

最好的方法(在我看来)是创build一个新的图像,从你的“myglassfish”图像延伸,并包括WAR文件。 该图像将具有与应用程序的发行版本匹配的标签。 我希望WAR文件已经发布到一个Maven仓库,你可以在镜像构build过程中从这个仓库下载。 如果WAR文件位于本地文件系统中,则将其复制到映像中。 最后一件事情是,如果您的计算机和boot2docker虚拟机共享文件时遇到问题,boot2docker会自动共享VM中的Users文件夹。 我希望我是有帮助的。 如果你有更多的问题,只需拍摄。

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

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

这是开发时间。 当您想要发布它时,可以使用在Dockerfile使用的ADDCOPY关键字将项目目录内容添加到图像。

有关更多信息, 请参阅卷文档 。