当前位置: 首页 > 知识库问答 >
问题:

如何为Java应用程序构建docker容器

诸经略
2023-03-14

但我的Dockerfile不再是独立的。它的工作取决于Docker外部发生的步骤。在我的Dockerfile中,我将有一个copyadd语句,用于将JAR文件复制到映像中。如果事先没有创建jar,则此语句将失败。所以仅仅执行Dockerfile可能无法工作。如果您想要与仅使用当前Dockerfile构建的服务集成,比如DockerHub上的自动构建特性,那么这就会成为一个问题。

在这种情况下,创建映像的所有必要步骤都被添加到Dockerfile中,因此只需执行Docker构建即可创建映像。

这种方法的主要问题是没有办法向Dockerfile添加应该在创建的docker映像之外执行的命令。这意味着我必须将源代码和构建工具添加到docker映像中,并在映像中构建JAR文件。这将导致我的图像比它必须的大,因为所有的文件添加将是不必要的在运行时。这也会为我的图像添加额外的图层。

共有1个答案

郭永怡
2023-03-14
├── Dockerfile
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── org
    │   │       └── demo
    │   │           └── App.java
    │   └── resources
    │       └── log4j.properties
    └── test
        └── java
            └── org
                └── demo
                    └── AppTest.java

映像构建如下:

docker build -t my-maven .

并按以下方式运行:

$ docker run -it --rm my-maven
0    [main] INFO  org.demo.App  - hello world
FROM maven:3.3-jdk-8-onbuild
CMD ["java","-jar","/usr/src/app/target/demo-1.0-SNAPSHOT-jar-with-dependencies.jar"]

如果希望优化映像以排除源代码,可以创建一个Dockerfile,只包含构建的JAR:

FROM java:8
ADD target/demo-1.0-SNAPSHOT-jar-with-dependencies.jar /opt/demo/demo-1.0-SNAPSHOT-jar-with-dependencies.jar
CMD ["java","-jar","/opt/demo/demo-1.0-SNAPSHOT-jar-with-dependencies.jar"]
docker run -it --rm -w /opt/maven \
   -v $PWD:/opt/maven \
   -v $HOME/.m2:/root/.m2 \
   maven:3.3-jdk-8 \
   mvn clean install

docker build -t my-app .
FROM maven:3.3-jdk-8-onbuild 

FROM java:8
COPY --from=0 /usr/src/app/target/demo-1.0-SNAPSHOT.jar /opt/demo.jar
CMD ["java","-jar","/opt/demo.jar"]
 类似资料:
  • 问题内容: 我要做的是为我的Java应用程序构建一个docker映像,但是以下注意事项对于大多数编译语言都应适用。 在构建服务器上,我想为应用程序生成一个docker映像作为可交付成果。为此,我必须使用一些构建工具(通常是Gradle,Maven或Ant)来编译应用程序,然后将创建的JAR文件添加到docker映像中。因为我希望Docker映像仅执行JAR文件,所以我当然将从已安装Java的基本映

  • 问题内容: 我通常在Linux系统上工作,但遇到一种情况,我需要编写一个客户端应用程序,该应用程序可以作为服务在Windows上运行。有人可以帮助我或指导我如何在Windows环境下构建MenuBar应用程序(例如Dropbox),该应用程序从操作系统启动开始,图标位于TaskBar中,然后单击该应用程序图标将显示一个菜单。 我的脚本语言是python。谢谢。 问题答案: 您可以使用pywin32

  • 目标 了解对象或对象集合如何变成应用程序 使用 Eclipse 创建驱动程序类 应用程序入口点 所有 Java 应用程序都需要一个入口点,让 Java 运行时知道将从这里开始执行代码。这个入口点就是 main() 方法。域对象(即应用程序的业务域 中包含的对象,例如 Person 和 Employee)通常没有 main() 方法,但每个应用程序中必须至少有一个类。 众所周知,Person 和它的

  • 问题内容: 我有一个Java应用程序,需要连接到MySQL。 提供后,我便可以构建Jar。但是,我想在网络中的Docker容器上运行它,我也有一个运行名称的MySQL容器。为了构建Jar,我输入了URL ,希望可以在容器内运行。但是我做不到,因为构建失败。我的猜测是,在我的本地计算机上,Spring无法指向该数据库URL。 如何使用URL as构建一个jar ? PS我不希望指向在本地主机上运行的

  • 问题内容: 对于这个问题,我实际上并没有太多的摆动或GUI设计方面的经验(大学中的一些WPF应用程序的水平差不多),但是我的任务是在工作中重构摆动旧式应用程序的一部分。 我被要求重构的部分围绕一个弹出窗口,该窗口可以根据特定的值对象以三种不同的格式显示。这3种不同的格式都共享一些基本字段,然后有条件地确定其他字段。负责此GUI元素的类的长度约为5k,我当时认为应该将其分为三个子类,并在基类中共享这

  • 问题内容: 我正在为NodeJS使用ExpressJS Web框架。 使用ExpressJS的人将他们的环境(开发,生产,测试…),路线等放置在。我认为这不是一个好方法,因为当您拥有大型应用程序时,app.js太大了! 我想要这个目录结构: 这是我的代码: app.js config / environment.js config / routes.js 我的代码运行良好,我认为目录的结构很漂亮。