Docker 与 Maven 和 Tomcat

我正在尝试使用 Java、Maven 和 Tomcat 创建一个记事本容器。


到目前为止,我能够使用 Maven 创建一个容器并编译我的 java 代码并创建最终的 WAR 文件。


但我想将此 WAR 文件复制到另一个 Tomcat 容器的特定文件夹(tomcat 的 webapp 文件夹)。


方法一,Dockerfile


FROM maven:3.6.1-jdk-8 as maven_builder


ENV HOME=/app


WORKDIR $HOME


ADD pom.xml $HOME


RUN ["/usr/local/bin/mvn-entrypoint.sh", "mvn", "verify", "clean", "--fail-never"]


ADD . $HOME


RUN ["mvn","clean","install","-T","2C","-DskipTests=true"]


FROM tomcat:8.5.43-jdk8


COPY --from=maven_builder $HOME/wc_admin/target/wc-admin.war /usr/local/tomcat/webapps

我试图简单地复制它,但在复制之前删除了中间容器。


方法 2,我正在尝试为 docker-compose 编写一个 YAML 并使用共享卷概念。


version: '3'

services:

    maven-build:

        build: .

        volumes:

            - 'myshare:/shared'


    tomcat-build:

        image: 'tomcat:8.5.43-jdk8'

        ports:

            - '8080:8080'

        volumes:

            - 'myshare:/shared'


volumes:

  myshare:

    driver: local '

我不知道如何将特定文件从一个容器(即 maven_build)复制到另一个容器(即 tomcat 的 webapp 文件夹)。


繁华开满天机
浏览 131回答 3
3回答

慕仙森

您的第一个(多阶段构建)方法是更好的做法。在多阶段构建中,每次你有一个新的FROM命令来启动一个新的图像时,执行环境都会重置。特别是,当第一阶段设置HOME环境变量时,该变量会在第二阶段重置,因此最终COPY命令是复制出/wc_admin/...而不是构建应用程序的目录。通常将 Docker 文件系统布局视为固定的,并且不设置HOME在其他上下文中有意义但在 Docker 中实际上没有意义的变量。我只是在整个过程中进行硬编码/app:FROM maven:3.6.1-jdk-8 as maven_builderWORKDIR /appADD pom.xml ....FROM tomcat:8.5.43-jdk8COPY --from=maven_builder /app/wc_admin/target/wc-admin.war /usr/local/tomcat/webapps卷方法有两个大问题。人们试图利用 Docker 用图像中的内容填充命名卷,但这只在您第一次运行它时有效。如果您重建映像,Docker 会拒绝接触该卷(它有必须保留的重要用户数据,这就是卷的用途),因此您的卷将保留您的旧文件.war。如果你曾经在 Kubernetes 中运行你的应用程序,它不会自动从图像填充卷,你需要做更多的工作才能使卷共享设置工作。

慕码人8056858

在你的方法一中,你在第一个容器中定义了一个 ENV 变量,而不是在第二个容器中(你可能想完全摆脱那个 ENV 和文件夹,我没有看到任何意义)我稍微修改了你的 Dockerfile 并在一个新的 maven 项目上进行了测试我还在RUN mvn dependency:go-offline -B您的第一个容器中添加了缓存中间容器以便更快地重新构建

白猪掌柜的

您的第一次尝试几乎是正确的,减去一个问题。环境变量对于容器的上下文是局部的。它们不会在构建阶段之间继承。在这个片段中FROM tomcat:8.5.43-jdk8COPY --from=maven_builder $HOME/wc_admin/target/wc-admin.war /usr/local/tomcat/webappstomcat$HOME图像对maven图像的环境变量一无所知FROM maven:3.6.1-jdk-8 as maven_builderENV HOME=/app因此它使用自己的$HOMEenvar。尝试这个:COPY --from=maven_builder /app/wc_admin/target/wc-admin.war /usr/local/tomcat/webapps
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java