3 回答
TA贡献1827条经验 获得超7个赞
您的第一个(多阶段构建)方法是更好的做法。
在多阶段构建中,每次你有一个新的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
添加回答
举报