为了账号安全,请及时绑定邮箱和手机立即绑定

Docker 与 Maven 和 Tomcat

Docker 与 Maven 和 Tomcat

繁华开满天机 2023-04-19 17:02:31
我正在尝试使用 Java、Maven 和 Tomcat 创建一个记事本容器。到目前为止,我能够使用 Maven 创建一个容器并编译我的 java 代码并创建最终的 WAR 文件。但我想将此 WAR 文件复制到另一个 Tomcat 容器的特定文件夹(tomcat 的 webapp 文件夹)。方法一,DockerfileFROM maven:3.6.1-jdk-8 as maven_builderENV HOME=/appWORKDIR $HOMEADD pom.xml $HOMERUN ["/usr/local/bin/mvn-entrypoint.sh", "mvn", "verify", "clean", "--fail-never"]ADD . $HOMERUN ["mvn","clean","install","-T","2C","-DskipTests=true"]FROM tomcat:8.5.43-jdk8COPY --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 文件夹)。
查看完整描述

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 中运行你的应用程序,它不会自动从图像填充卷,你需要做更多的工作才能使卷共享设置工作。


查看完整回答
反对 回复 2023-04-19
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

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

我稍微修改了你的 Dockerfile 并在一个新的 maven 项目上进行了测试

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


查看完整回答
反对 回复 2023-04-19
?
白猪掌柜的

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


查看完整回答
反对 回复 2023-04-19
  • 3 回答
  • 0 关注
  • 130 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信