如何dockerize Maven项目? 以及有多less种方法来完成它?
我是新来的Docker,并不知道如何用maven运行一个java项目,即使我已经阅读了许多文档,并尝试了很多方法。
- 我应该使用
Dockerfile
生成图像吗? - 当使用
Dockerfile
在主机上运行maven项目时,有什么命令?
尝试使用新的官方图片,Maven有一个
https://registry.hub.docker.com/_/maven/
该图像可用于在构build时运行Maven来创build一个编译的应用程序,或者像下面的例子一样,在一个容器中运行一个Maven构build。
示例1 – 在一个容器中运行的Maven
以下命令在容器中运行Maven构build:
docker run -it --rm \ -v "$(pwd)":/opt/maven \ -w /opt/maven \ maven:3.2-jdk-7 \ mvn clean install
笔记:
- 这种方法的好处是所有的软件都安装在容器中运行。 只需要主机上的docker。
- 请参阅此版本的Dockerfile
示例2 – 使用Nexus来caching文件
运行Nexus容器
docker run -d -p 8081:8081 --name nexus sonatype/nexus
创build一个“settings.xml”文件:
<settings> <mirrors> <mirror> <id>nexus</id> <mirrorOf>*</mirrorOf> <url>http://nexus:8081/content/groups/public/</url> </mirror> </mirrors> </settings>
现在运行连接到nexus容器的Maven,这样依赖关系将被caching
docker run -it --rm \ -v "$(pwd)":/opt/maven \ -w /opt/maven \ --link nexus:nexus \ maven:3.2-jdk-7 \ mvn -s settings.xml clean install
笔记:
- 在后台运行Nexus的一个优点是,其他第三方存储库可以通过pipe理URL来透明地pipe理在本地容器中运行的Maven构build版本。
可能有很多方法..但我通过以下两种方式实现
给出的例子是maven项目。
1.在maven项目中使用Dockerfile
使用以下文件结构:
Demo └── src | ├── main | │ ├── java | │ └── org | │ └── demo | │ └── Application.java | │ | └── test | ├──── Dockerfile ├──── pom.xml
并将Dockerfile更新为:
FROM java:8 EXPOSE 8080 ADD /target/demo.jar demo.jar ENTRYPOINT ["java","-jar","demo.jar"]
导航到项目文件夹,然后input以下命令来创build映像并运行该映像:
$ mvn clean $ mvn install $ docker build -f Dockerfile -t springdemo . $ docker run -p 8080:8080 -t springdemo
在Spring Boot中使用Docker获取video
2.使用Maven插件
在pom.xml
添加给定的maven插件
<plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.5</version> <configuration> <imageName>springdocker</imageName> <baseImage>java</baseImage> <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin>
导航到项目文件夹并键入以下命令,您将能够创build映像并运行该映像:
$ mvn clean package docker:build $ docker images $ docker run -p 8080:8080 -t <image name>
在第一个例子中,我们正在创buildDockerfile并提供基础镜像并添加jar,所以在完成之后,我们将运行docker命令来构build具有特定名称的映像,然后运行该映像。
而在第二个例子中,我们使用了maven插件,在这个插件中我们提供了baseImage
和imageName
所以我们不需要在这里创buildDockerfile。打包Maven项目之后,我们将得到Docker镜像,我们只需要运行该镜像。
作为一个经验法则,您应该使用Maven(一个包含代码和所有依赖关系的JAR)构build一个胖JAR 。
然后你可以编写一个符合你需求的Dockerfile (如果你可以构build一个胖JAR,你只需要一个基本的操作系统,比如CentOS和JVM)。
这是我用于Scala应用程序(这是基于Java的)。
FROM centos:centos7 # Prerequisites. RUN yum -y update RUN yum -y install wget tar # Oracle Java 7 WORKDIR /opt RUN wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/7u71-b14/server-jre-7u71-linux-x64.tar.gz RUN tar xzf server-jre-7u71-linux-x64.tar.gz RUN rm -rf server-jre-7u71-linux-x64.tar.gz RUN alternatives --install /usr/bin/java java /opt/jdk1.7.0_71/bin/java 1 # App USER daemon # This copies to local fat jar inside the image ADD /local/path/to/packaged/app/appname.jar /app/appname.jar # What to run when the container starts ENTRYPOINT [ "java", "-jar", "/app/appname.jar" ] # Ports used by the app EXPOSE 5000
这创build了一个基于CentOS的Java7图像。 开始时,它会执行你的应用程序jar。
部署它的最好方法是通过Docker Registry,就像Docker镜像的Github一样。
你可以像这样构build一个图像:
# current dir must contain the Dockerfile docker build -t username/projectname:tagname .
然后你可以用这种方式推送一个图像:
docker push username/projectname # this pushes all tags
一旦图像在Docker Registry上,你可以从世界上的任何地方拉它并运行它。
请参阅Docker用户指南了解更多信息。
请记住一些事情 :
你也可以把你的版本库放到一个映像中,并把它作为容器执行的一部分来构build,但这不是一个好的方法,因为代码可能会改变,最终你可能会在不通知的情况下使用不同版本的应用程序。
build立一个胖jar子可以解决这个问题。
- Docker + Django,服务器运行但欢迎页面不显示
- “docker-compose pull”无法拉出“docker”
- 从Docker中的bash中logging:logging器错误:socket / dev / log:没有这样的文件或目录
- Docker更新挂在Windows 10上
- Docker-Compose HAProxy缺less前端
- 具有较高CPU使用率的logstash kafkainputfilter
- 用TexLive 2017和latexml构builddocker图像
- Docker和Chromium net :: ERR_NETWORK_CHANGED
- 复制文件并在容器启动时从Docker上的共享卷创build符号链接