簡體   English   中英

如何編寫 dockerfile 以在包含 jdk 的現有 Spring Boot 項目上添加 maven 構建

[英]How to write a dockerfile to add maven build on existing spring boot project which contains jdk

我的老板放假了幾天,我是一個java開發我對docker不是很了解(只有基礎知識)

我有 java Spring boot 項目,因為項目的根目錄中有一個 Dockerfile。

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

我想在不修改結構的情況下將 maven 添加到其中。 和 maven 應該干凈包裝它。?

例如。 docker build -t user/myimage 。

它應該自動安裝 maven 並清理我的項目。 無需我明確運行 mvn clean package

我之前從stackoverflow獲得的資源很少,但我無法進行實驗,我需要可以運行前面提到的給定 jdk 腳本的代碼。

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

我請求您為 Maven 清潔包提供一個等效的腳本,以便我可以將它添加到構建我的圖像的 dockerfile 中。

這通常是 2 個步驟:

  1. 構建罐子。
  2. 運行 docker build 以構建包含 jar 的映像。

有 maven/gradle 插件可以幫助你從你的 maven 構建中自動化這個過程,請參閱 dockerfile-maven,這可能是你正在尋找的: https : //github.com/spotify/dockerfile-maven

我之前從 stackoverflow 獲得的資源很少,但我無法進行實驗,我需要可以運行前面提到的給定 jdk 腳本的代碼。

如果我理解得很好,你的問題是你想在 docker build 中添加 maven 打包步驟,同時在運行時仍然使用那個確切版本的 JDK : FROM openjdk:8-jdk-alpine並且不依賴於該基礎鏡像: FROM maven:3.6.0-jdk-11-slim AS build

第一件事:不要擔心在 Docker Build 中依賴另一個基礎 docker 鏡像。
自 17.05 Docker 版本 (05/2017) 以來,Docker 構建具有多階段構建功能,它允許在構建中定義多個階段並滿足您的需求。
實際上,在第一階段您可以依靠 maven docker 鏡像來構建您的應用程序,而在第二階段您可以依靠 JDK docker 鏡像來運行您的應用程序。
多階段構建功能還有另一個優點:圖像尺寸優化,因為先前步驟生成的中間層不會保留在最終圖像尺寸中。
對於像集成/生產這樣的環境,這可能是我會使用的方式。

回到您的問題,如果您想使用您鏈接的答案,您需要更改的主要內容是最終基礎映像的 JDK 標簽以滿足您的要求,您還應該調整一些小東西。
作為旁注,目前您將 JAR 復制到圖像的根目錄。 出於安全原因,這不是一個好的做法。 您應該將它復制到一個文件夾中,例如/app

當您引用由 maven 構建的 jar 時,最好在 jar 前面加上其 artifactId/final 名稱而沒有其版本,而不是像您在此處所做的那樣將目標文件夾中的任何 jar 視為胖 jar: ARG JAR_FILE=target/*.jar

所以它會給:

# Build stage
FROM maven:3.6.0-jdk-11-slim AS build
COPY pom.xml /app/
COPY src /app/src
RUN mvn -f /app/pom.xml clean package

# Run stage
FROM openjdk:8-jdk-alpine # Use your target JDK here !
COPY --from=build /app/target/app*.jar /app/app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/app.jar"]

請注意,建議的解決方案非常簡單,在許多情況下就足夠了,但可能不適合您的具體情況。
確實有幾種方法可以處理您的問題。 根據您的目標環境,您的要求不一樣,策略也會不同。
這些要求可能是構建速度、最終圖像大小優化、本地開發人員的快速反饋。 而所有這些都不一定兼容。
Docker 構建區確實是一個非常大的主題。 我強烈建議您多學習,以便能夠根據您的實際需求調整 docker build 解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM