如何做多克玉米项目?有多少种方法可以实现它?工作示例。更新 (2019-02-07)原始答案(为完整起见,包括,但写于很久以前)
我是Docker的新手,不知道如何使用maven运行Java项目,即使我已经阅读了许多文档并尝试了许多方法。
- 我应该使用 构建映像吗?
Dockerfile
- 当使用 在主机中运行 maven 项目时,命令是什么样的?
Dockerfile
我是Docker的新手,不知道如何使用maven运行Java项目,即使我已经阅读了许多文档并尝试了许多方法。
Dockerfile
Dockerfile
这不是一个弹簧靴教程。这是对如何在 Docker 容器中运行 Maven 构建的问题的更新答案。
问题最初发布于4年前。
使用弹簧初始值设定项生成演示应用
在本地提取 zip 存档
#
# Build stage
#
FROM maven:3.6.0-jdk-11-slim AS build
COPY src /home/app/src
COPY pom.xml /home/app
RUN mvn -f /home/app/pom.xml clean package
#
# Package stage
#
FROM openjdk:11-jre-slim
COPY --from=build /home/app/target/demo-0.0.1-SNAPSHOT.jar /usr/local/lib/demo.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/usr/local/lib/demo.jar"]
注意
docker build -t demo .
$ docker run --rm -it demo:latest
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.3.RELEASE)
2019-02-22 17:18:57.835 INFO 1 --- [ main] com.example.demo.DemoApplication : Starting DemoApplication v0.0.1-SNAPSHOT on f4e67677c9a9 with PID 1 (/usr/local/bin/demo.jar started by root in /)
2019-02-22 17:18:57.837 INFO 1 --- [ main] com.example.demo.DemoApplication : No active profile set, falling back to default profiles: default
2019-02-22 17:18:58.294 INFO 1 --- [ main] com.example.demo.DemoApplication : Started DemoApplication in 0.711 seconds (JVM running for 1.035)
阅读 Docker 中心文档,了解如何优化 Maven 构建以使用本地存储库缓存 jar。
这个问题现在已经4年了,在那段时间里,可以公平地说,使用Docker构建应用程序已经发生了重大变化。
这种新样式使您能够创建更轻量级的图像,这些图像不会封装您的构建工具和源代码。
此处的示例再次使用官方 maven 基础映像,使用所需版本的 Maven 运行生成的第一阶段。该文件的第二部分定义了如何将构建的 jar 组装到最终输出映像中。
FROM maven:3.5-jdk-8 AS build
COPY src /usr/src/app/src
COPY pom.xml /usr/src/app
RUN mvn -f /usr/src/app/pom.xml clean package
FROM gcr.io/distroless/java
COPY --from=build /usr/src/app/target/helloworld-1.0.0-SNAPSHOT.jar /usr/app/helloworld-1.0.0-SNAPSHOT.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/usr/app/helloworld-1.0.0-SNAPSHOT.jar"]
注意:
我没有使用这种方法,但似乎值得研究,因为它使您能够构建映像,而不必创建令人讨厌的东西,如Dockerfiles:-)
https://github.com/GoogleContainerTools/jib
该项目有一个Maven插件,它将代码的打包直接集成到Maven工作流程中。
尝试使用新的官方图像,Maven有一个
https://registry.hub.docker.com/_/maven/
该映像可用于在生成时运行 Maven 以创建已编译的应用程序,或者如以下示例所示,在容器中运行 Maven 生成。
以下命令在容器内运行 Maven 构建:
docker run -it --rm \
-v "$(pwd)":/opt/maven \
-w /opt/maven \
maven:3.2-jdk-7 \
mvn clean install
笔记:
运行 Nexus 容器
docker run -d -p 8081:8081 --name nexus sonatype/nexus
创建一个“设置.xml”文件:
<settings>
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://nexus:8081/content/groups/public/</url>
</mirror>
</mirrors>
</settings>
现在运行 Maven 链接到 nexus 容器,以便缓存依赖项
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
笔记:
可能有很多方法..但是我通过以下两种方式实现
给出的例子是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"]
导航到项目文件夹并键入以下命令,您将创建映像并运行该映像:
$ mvn clean
$ mvn install
$ docker build -f Dockerfile -t springdemo .
$ docker run -p 8080:8080 -t springdemo
2. 使用 Maven 插件
在 中添加给定的 maven 插件pom.xml
<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>
导航到项目文件夹并键入以下命令,您将能够创建映像并运行该映像:
$ mvn clean package docker:build
$ docker images
$ docker run -p 8080:8080 -t <image name>
在第一个示例中,我们正在创建 Dockerfile 并提供基本映像并添加 jar a so,之后我们将运行 docker 命令来构建具有特定名称的映像,然后运行该映像。
而在第二个例子中,我们使用的是我们提供的maven插件,因此我们不需要在这里创建Dockerfile。打包 maven 项目后,我们将获得 docker 映像,我们只需要运行该映像。baseImage
imageName