Docker 与 Maven 和 Tomcat

Sri*_*mar 6 java tomcat maven docker

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

到目前为止,我能够使用 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
Run Code Online (Sandbox Code Playgroud)

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

方法 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 '
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*aze 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
Run Code Online (Sandbox Code Playgroud)

体积方法有两个大问题。人们尝试利用 Docker 用映像中的内容填充命名卷,但这仅在第一次运行时有效。如果您重建映像,Docker 会拒绝接触该卷(它具有必须保留的重要用户数据,这就是卷的用途),因此您的卷将保留旧文件.war。如果您在 Kubernetes 中运行应用程序,它不会自动从映像填充卷,您需要做更多的工作才能使卷共享设置起作用。