java - 如何 jetty 化maven项目?有多少种方法来完成它?

标签 java maven docker

我是 Docker 新手,不知道如何使用 maven 运行 java 项目,尽管我已经阅读了很多文档并尝试了很多方法。

  1. 我应该使用 Dockerfile 构建镜像吗?
  2. 使用Dockerfile在宿主机中运行maven项目的命令是什么样的?

最佳答案

工作示例。

这不是 Spring Boot 教程。这是关于如何在 Docker 容器中运行 Maven 构建的问题的更新答案。

问题最初是在 4 年前发布的。

1。生成应用程序

使用 spring 初始化器生成演示应用程序

https://start.spring.io/

enter image description here

在本地解压 zip 存档

2。创建 Dockerfile

#
# 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"]

注意

  • 此示例使用 multi-stage build .第一阶段用于构建代码。第二阶段仅包含构建的 jar 和运行它的 JRE(注意 jar 是如何在阶段之间复制的)。

3。构建镜像

docker build -t demo .

4。运行镜像

$ 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。

更新 (2019-02-07)

这个问题已经有 4 年历史了,可以说使用 Docker 构建应用程序已经发生了重大变化。

选项 1:多阶段构建

这种新样式使您能够创建不封装构建工具和源代码的更轻量级的图像。

这里的示例再次使用 official 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"]  

注意:

  • 我使用的是 Google 的 distroless基本镜像,它努力为 Java 应用程序提供足够的运行时间。

选项 2:吊臂

我没有使用过这种方法,但似乎值得研究一下,因为它使您能够构建图像而不必创建像 Dockerfile 之类的讨厌的东西 :-)

https://github.com/GoogleContainerTools/jib

该项目有 Maven plugin它将您的代码打包直接集成到您的 Maven 工作流程中。


原始答案(为了完整性而包含在内,但写于很久以前)

尝试使用新的官方图片,Maven 有一张

https://registry.hub.docker.com/_/maven/

该镜像可用于在构建时运行 Maven 以创建已编译的应用程序,或者如以下示例所示,在容器中运行 Maven 构建。

示例 1 - Maven 在容器中运行

以下命令在容器内运行您的 Maven 构建:

docker run -it --rm \
       -v "$(pwd)":/opt/maven \
       -w /opt/maven \
       maven:3.2-jdk-7 \
       mvn clean install

注意事项:

  • 这种方法的巧妙之处在于,所有软件都在容器中安装和运行。只需要宿主机上的 docker。
  • Dockerfile for this version

示例 2 - 使用 Nexus 缓存文件

运行 Nexus 容器

docker run -d -p 8081:8081 --name nexus sonatype/nexus

创建一个“settings.xml”文件:

<settings>
  <mirrors>
    <mirror>
      <id>nexus</id>
      <mirrorOf>*</mirrorOf>
      <url>http://nexus:8081/content/groups/public/</url>
    </mirror>
  </mirrors>
</settings>

现在运行链接到 nexus 容器的 Maven,以便缓存依赖项

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 的一个优势是可以通过管理 URL 管理其他第 3 方存储库,对在本地容器中运行的 Maven 构建透明。

关于java - 如何 jetty 化maven项目?有多少种方法来完成它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27767264/

相关文章:

java - Maven-surefire-plugin 测试在 Jenkins 构建中失败但在本地运行成功?

.net - Dotnet watch 在 docker-compose 中失败

java - 在 IntelliJ IDEA 14.1.0 中启用 Web 应用程序支持

java - 删除标点符号、非阿拉伯语单词和数字(点和逗号除外)

使用 maven 设置 Android 支持库

docker - 无法启动docker daemon,无法连接做容器

docker - 如何删除所有 docker 卷?

java - 从 selectOneMenu JSF 获取值

java.lang.NoSuchMethodError : No static method zzb(ZLjava/lang/Object;)V in class Lcom/google/android/gms/common/internal/zzaa; or its super classes 错误

java - java:软件包org.springframework.dao和org.springframework.jdbc.core不存在