3 回答

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊
您的第一個(gè)(多階段構(gòu)建)方法是更好的做法。
在多階段構(gòu)建中,每次你有一個(gè)新的FROM命令來啟動(dòng)一個(gè)新的圖像時(shí),執(zhí)行環(huán)境都會(huì)重置。特別是,當(dāng)?shù)谝浑A段設(shè)置HOME環(huán)境變量時(shí),該變量會(huì)在第二階段重置,因此最終COPY命令是復(fù)制出/wc_admin/...而不是構(gòu)建應(yīng)用程序的目錄。
通常將 Docker 文件系統(tǒng)布局視為固定的,并且不設(shè)置HOME在其他上下文中有意義但在 Docker 中實(shí)際上沒有意義的變量。我只是在整個(gè)過程中進(jìn)行硬編碼/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
卷方法有兩個(gè)大問題。人們試圖利用 Docker 用圖像中的內(nèi)容填充命名卷,但這只在您第一次運(yùn)行它時(shí)有效。如果您重建映像,Docker 會(huì)拒絕接觸該卷(它有必須保留的重要用戶數(shù)據(jù),這就是卷的用途),因此您的卷將保留您的舊文件.war。如果你曾經(jīng)在 Kubernetes 中運(yùn)行你的應(yīng)用程序,它不會(huì)自動(dòng)從圖像填充卷,你需要做更多的工作才能使卷共享設(shè)置工作。

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

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