如何做多克玉米项目?有多少种方法可以实现它?工作示例。更新 (2019-02-07)原始答案(为完整起见,包括,但写于很久以前)

2022-08-31 07:46:16

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

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

答案 1

工作示例。

这不是一个弹簧靴教程。这是对如何在 Docker 容器中运行 Maven 构建的问题的更新答案。

问题最初发布于4年前。

1. 生成应用程序

使用弹簧初始值设定项生成演示应用

https://start.spring.io/

enter image description here

在本地提取 zip 存档

2. 创建 Docker 文件

#
# 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 中心文档,了解如何优化 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

创建一个“设置.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

笔记:

  • 在后台运行Nexus的一个优点是,其他第三方存储库可以通过管理URL透明地管理在本地容器中运行的Maven构建。

答案 2

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

给出的例子是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 插件

在 中添加给定的 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 映像,我们只需要运行该映像。baseImageimageName


推荐