如何码头化maven项目?有多少种方法来完成它?

新手上路,请多包涵

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

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

原文由 Yashon Lin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 211
2 个回答

工作示例。

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

问题最初发布于 4 年前。

1. 生成应用程序

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

https://start.spring.io/

在此处输入图像描述

在本地提取 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"]

笔记

  • 此示例使用 多阶段构建。第一阶段用于构建代码。第二阶段只包含构建的 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 hub 文档,了解如何优化 Maven 构建以使用本地存储库来缓存 jar。


更新(2019-02-07)

这个问题现在已经 4 年了,在那个时候,可以说使用 Docker 构建应用程序已经发生了重大变化。

选项 1:多阶段构建

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

此处的示例再次使用 官方 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:吊臂

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

https://github.com/GoogleContainerTools/jib

该项目有一个 Maven 插件,它将您的代码打包直接集成到您的 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

笔记:

示例 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 对在本地容器中运行的 Maven 构建透明地管理其他 3rd 方存储库。

原文由 Mark O‘Connor 发布,翻译遵循 CC BY-SA 4.0 许可协议

可能有很多方法..但我通过以下两种方式实现

给定的例子是 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

使用 Docker 在 Spring Boot 上 获取视频

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>

导航到项目文件夹并键入以下命令,您将能够创建图像并运行该图像:

 $ mvn clean package docker:build
$ docker images
$ docker run -p 8080:8080 -t <image name>

在第一个示例中,我们正在创建 Dockerfile 并提供基本映像并添加 jar ,然后我们将运行 docker 命令以构建具有特定名称的映像,然后运行该映像。

而在第二个示例中,我们使用的是 maven 插件,其中我们提供了 baseImageimageName 所以我们不需要在这里创建 Dockerfile .. 打包 maven 项目后,我们将获得 docker 镜像我们只需要运行该图像..

原文由 Riddhi Gohil 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题