3 回答

TA貢獻1827條經驗 獲得超8個贊
您的第一個(多階段構建)方法是更好的做法。
在多階段構建中,每次你有一個新的FROM命令來啟動一個新的圖像時,執行環境都會重置。特別是,當第一階段設置HOME環境變量時,該變量會在第二階段重置,因此最終COPY命令是復制出/wc_admin/...而不是構建應用程序的目錄。
通常將 Docker 文件系統布局視為固定的,并且不設置HOME在其他上下文中有意義但在 Docker 中實際上沒有意義的變量。我只是在整個過程中進行硬編碼/app:
FROM maven:3.6.1-jdk-8 as maven_builder
WORKDIR /app
ADD pom.xml .
...
FROM tomcat:8.5.43-jdk8
COPY --from=maven_builder /app/wc_admin/target/wc-admin.war /usr/local/tomcat/webapps
卷方法有兩個大問題。人們試圖利用 Docker 用圖像中的內容填充命名卷,但這只在您第一次運行它時有效。如果您重建映像,Docker 會拒絕接觸該卷(它有必須保留的重要用戶數據,這就是卷的用途),因此您的卷將保留您的舊文件.war。如果你曾經在 Kubernetes 中運行你的應用程序,它不會自動從圖像填充卷,你需要做更多的工作才能使卷共享設置工作。

TA貢獻1803條經驗 獲得超6個贊
在你的方法一中,你在第一個容器中定義了一個 ENV 變量,而不是在第二個容器中(你可能想完全擺脫那個 ENV 和文件夾,我沒有看到任何意義)
我稍微修改了你的 Dockerfile 并在一個新的 maven 項目上進行了測試
我還在RUN mvn dependency:go-offline -B
您的第一個容器中添加了緩存中間容器以便更快地重新構建

TA貢獻1893條經驗 獲得超10個贊
您的第一次嘗試幾乎是正確的,減去一個問題。環境變量對于容器的上下文是局部的。它們不會在構建階段之間繼承。
在這個片段中
FROM tomcat:8.5.43-jdk8
COPY --from=maven_builder $HOME/wc_admin/target/wc-admin.war /usr/local/tomcat/webapps
tomcat$HOME圖像對maven圖像的環境變量一無所知
FROM maven:3.6.1-jdk-8 as maven_builder
ENV HOME=/app
因此它使用自己的$HOMEenvar。
嘗試這個:
COPY --from=maven_builder /app/wc_admin/target/wc-admin.war /usr/local/tomcat/webapps
添加回答
舉報