【问题标题】:Docker with Maven and TomcatDocker 与 Maven 和 Tomcat
【发布时间】:2019-12-03 12:18:08
【问题描述】:

我正在尝试使用 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 文件夹)。

【问题讨论】:

    标签: java maven docker tomcat


    【解决方案1】:

    您的第一个(多阶段构建)方法是更好的做法。

    在多阶段构建中,每次你有一个新的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 中运行您的应用程序,它不会自动从图像中填充卷,您需要做更多的工作才能使用于共享的卷设置正常工作。

    【讨论】:

    • 感谢您的建议,但如果我想重新构建一些代码更改怎么办?在这种情况下,卷不会有帮助吗?
    • 尤其是在 Java 的情况下(无论如何您都需要重新编译代码)。
    【解决方案2】:

    您的第一次尝试几乎是正确的,减去了一个问题。环境变量对于容器的上下文是本地的。 它们不会在构建阶段之间继承。

    在这个sn-p中

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

    tomcatimage对maven image的$HOME环境变量一无所知

    FROM maven:3.6.1-jdk-8 as maven_builder
    
    ENV HOME=/app
    

    因此它使用自己的$HOME envar。

    试试这个:

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

    【讨论】:

      【解决方案3】:

      在您的方法中,您在第一个容器中定义了一个 ENV 变量,而不是在第二个容器中(您可能想完全摆脱那个 ENV 和文件夹,我看不出任何意义)

      我稍微修改了你的 Dockerfile 并在一个新的 maven 项目上进行了测试,你可能想参考this project

      我还在您的第一个容器中添加了 RUN mvn dependency:go-offline -B 以缓存中间容器以便更快地重新构建

      【讨论】:

      • 我也有一些本地 jar 引用,所以它在依赖项失败:go-offline 命令。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多