【问题标题】:Docker Springboot Webapp Included LibrariesDocker Springboot Webapp 包含的库
【发布时间】:2021-07-22 08:23:51
【问题描述】:

我通过 Docker 将 Springboot jar 部署为 webapp。这是我的 Dockerfile 的基本概要。

#
# Build App
#
FROM maven:3.6.3-openjdk-15-slim AS build

# Copy Parent Project
COPY src /home/app/src
COPY pom.xml /home/app

RUN mvn -f /home/app/pom.xml clean package -DskipTests

#
# Deploy App
#
FROM openjdk:15-jdk-alpine
COPY --from=build /home/app/my-app/target/my-app-rest-0.0.1-SNAPSHOT.jar /usr/local/lib/app.jar
ENTRYPOINT exec java -Djava.security.egd=file:/dev/./urandom -jar /usr/local/lib/app.jar

我最初在互联网上发现了一个类似于这个 Dockerfile 的模式,我以为我理解了其中的大部分内容,但有一件事让我难以理解:我的 app.jar 运行所需的所有依赖 jar 都在哪里?我的项目正在运行和执行得很好,所以它们必须在我的容器中的某个地方。但是我已经搜索和搜索但找不到任何依赖 jar 甚至我的 webapp 的 WEB-INF 目录。我知道我的实际应用程序 jar 在 /usr/local/lib/ 中,但这就是我能推断的全部。

是否存在依赖项/webapp 配置所在的默认位置?有什么我可以添加到我的 Dockerfile 来定义它应该去哪里的东西吗?

【问题讨论】:

  • maven 可能在 docker 中构建了自己的存储库 /root/.m2

标签: java spring spring-boot docker maven


【解决方案1】:

Spring boot 将您所有的依赖项(jar)放入胖可执行 jar 中,这是您传递到运行阶段的那个,也是您使用 java 命令运行的那个。

由于 jar 文件只是压缩档案,您可以通过解压缩并在其中窥视来提取它们:

docker cp <container-id>:/home/app/my-app/target/my-app-rest-0.0.1-SNAPSHOT.jar myjar.jar
unzip myjar.jar -d myjar
ls -al myjar/BOOT-INF/lib

您将获得 Spring Boot 应用所依赖的所有 jar 的列表。

更多信息herehere

【讨论】:

  • 啊,好吧!我不知道 Spring Boot 做了一个“胖”的罐子。这就说得通了。有没有办法配置 Spring Boot 以将依赖项保存在单独的库文件夹中?
  • 是的,当然可以!所有这些都是使用构建工具完成的,无论是 maven 还是 gradle。根据您的用例,您可以通过多种不同的方式执行此操作。其中一个在这里baeldung.com/spring-boot-multiple-modules 您还可以将您的应用程序打包成另一种格式,例如将其打包为一个war,并在单独的应用服务器中运行。
【解决方案2】:

Maven用于构建你的.jar包,而你只需要将.jar包放入docker镜像并添加java -jar ...作为入口点。

请注意,Docker 强烈建议程序员将应用程序分成单独的 Docker 映像。即使您可以同时拥有 Maven 和 .jar,也不要这样做。

是否存在依赖项/webapp 配置所在的默认位置?

是的。这是我在工作中使用的 Dockerfile。您在开发机器上而不是在 Dockerfile 中运行诸如 cleanpackage 之类的 maven 命令。

FROM openjdk:8-jdk-alpine
# You want to change JDK version.

ADD target/*.jar app.jar
# You have to place this Dockerfile in the SAME directory with the target folder. Then this Dockerfile pulls whatever jar you have under target, renames it to app.jar and adds it to the build.

EXPOSE 9001
# You want to change this to whatever port your java app listens on.

ENTRYPOINT ["java", "-jar", "/app.jar"]
# Typical command you use to run .jar package but this time, you use it as the entrypoint.

一旦你有了.jar 包,cd 进入 Dockerfile 目录和docker build .

【讨论】:

  • 这里有有用的信息,谢谢。不过,我认为 M. Iduoad 更好地回答了我的具体问题,所以我选择了他们的答案。
猜你喜欢
  • 2019-03-11
  • 2018-03-08
  • 2018-08-06
  • 1970-01-01
  • 2015-01-09
  • 2021-10-13
  • 2021-09-26
  • 2020-04-02
  • 1970-01-01
相关资源
最近更新 更多