Docker with Maven and Tomcat



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

到目前为止,我能够使用 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文件夹)。

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

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

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

在此代码段中

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

tomcat图像对maven图像的环境变量一无所知$HOME

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

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

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

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

最新更新