maven - 如何在 Docker 容器中自动重建 Java Webapp

标签 maven docker tomcat docker-compose

我需要提供 POC 作为当前工作中工作流程迁移的论据。目前我们这样做:

  1. 人们在 Netbeans 上编写代码
  2. 人们点击在 netbeans 上构建
  3. 本地部署
  4. 应用代码更改
  5. Netbeans 重建并重新部署代码。

要知道的事情:

  • 似乎 tomcat 检测到何时将新的 WAR 放入目录并热部署它;
  • 我旨在自动化的不是热部署(因为这已经是 tomcat 的一项功能),而是构建过程;
  • 我们正在使用 Maven 构建项目。
  • 我正在使用 docker-compose 将所有内容整合到一个规范中。

到目前为止,我已经能够容器化 Postgres 数据库、我们使用的 PGAdmin 以及使用多阶段 Dockerfile 的应用程序的初始构建。

Tomcat 应用程序 Dockerfile

FROM maven AS buildserver

ADD . /usr/src/mymaven/
WORKDIR /usr/src/mymaven
# build the project
RUN mvn -f pom.xml clean package -DskipTests

FROM tomcat:latest
COPY conf-tomcat/tomcat-users.xml /usr/local/tomcat/conf/
COPY conf-tomcat/server.xml /usr/local/tomcat/conf/
COPY conf-tomcat/context.xml /usr/local/tomcat/webapps/manager/META-INF/
# Copy the built war file into webapps folder of tomcat container
COPY --from=buildserver /usr/src/mymaven/target/*.war /usr/local/tomcat/webapps

我遇到的问题是在代码更改时触发重建(模仿 netbeans 所做的)。我无法在 maven 或 netbeans 文档中找到该检测和触发的工作原理。

我正在使用卷将应用程序源目录映射到容器,希望它能正常工作,但我错了。

我的docker-compose.yml如下:

version: '3'
services:
  pgadmin:
    container_name: pgadmin
    image: dpage/pgadmin4
    env_file:
      - ../db-postgres/pgadmin/pgadmin.env
    depends_on:
      - pg-dev
    networks:
      - dev-network
    volumes:
      - pgadmin-data:/var/lib/pgadmin
    ports:
      - "88:80"
  pg-dev:
    container_name: pg-dev
    image: pg-dev:latest
    env_file:
      - ../db-postgres/db-dev/pg-dev.env
    volumes:
      - pg-data:/var/lib/postgresql/data
    networks:
      - dev-network
    ports:
      - "5433:5432"
  app:
    container_name: app
    build: .
    volumes:
      - app-src:/usr/src/mymaven
      - artifacts:/usr/src/mymaven/target
      - maven-repo:/root/.m2
    networks:
      - dev-network
    ports:
      - "8888:8080"
    depends_on:
      - pg-dev
volumes:
  maven-repo:
    driver: local
    driver_opts:
      type: bind
      device: $HOME/.m2
      o: bind
  app-src:
    driver: local
    driver_opts:
      type: bind
      device: .
      o: bind
  artifacts:
    driver: local
    driver_opts:
      type: bind
      device: target/
      o: bind
  pg-data:
  pgadmin-data:
networks:
  dev-network:

感谢任何为此提出解决方案的帮助,以及有关如何改进此工作流程/构建的任何一般性建议。

更新

我想出了一些变通办法,但现在我在测试它时遇到了问题。

我定义了一个 Maven 容器作为构建服务器:

FROM maven

ADD . /usr/src/mymaven/
WORKDIR /usr/src/mymaven
RUN apt update && apt install entr -y
# build the project
RUN mvn -f pom.xml clean package -DskipTests

现在我在 docker-compose.yml 上定义入口点:

...
 buildserver:
    container_name: buildserver
    build:
      context: .
      dockerfile: maven-builder.Dockerfile
    volumes:
      - app-src:/usr/src/mymaven
      - maven-repo:/root/.m2
      - artifacts:/usr/src/mymaven/target
    networks:
      - dev-network
    entrypoint: sh -c 'find src/ | entr mvn -f pom.xml clean package -DskipTests --batch-mode'
...

但是现在当这个容器启动时我收到一条错误消息:

find: ‘src/’: No such file or directory
entr: No regular files to watch

这对我来说很奇怪,因为我在第一次运行时成功构建了项目,但入口点似乎失败了。

澄清:我被问到的是提出一个工作流,该工作流消除了使用 Netbeans 部署的需要(他们希望一切都是自动的)。我四处寻找 Jenkins 工作流程,但无法真正找到实现预期结果的方法。

最佳答案

根据 Netbeans 文档,您可以将 Maven 目标绑定(bind)到 IDE 操作(http://wiki.netbeans.org/MavenBestPractices 部分将 Maven 目标绑定(bind)到 IDE 操作):

It's possible to customize the default Maven goal to IDE Action binding from the project's customizer. Right click on the project node and select "Properties" or use the File/Project Properties main menu item to invoke the Project properties dialog. On the left hand side, select the panel named "Actions". The panel lists all available default project actions that can be mapped. When selecting one from the list the textfields in the bottom allow to change the values.

在我看来,您应该将 Build Project Netbeans 操作绑定(bind)到特定的 Maven 目标。从这一点来看,由你来想出一个创造性的解决方案。您可以探索 Maven Exec 插件功能并在构建过程中运行自定义命令(检查 I want to execute shell commands from Maven's pom.xml )。例如,应该可以将 .war 文件从目标文件夹复制到文件系统上您想要的任何位置,甚至可以在正在运行的容器内执行脚本。

PS:看起来你正在尝试做一些很奇怪的事情,但我假设在这里以某种方式解决这个问题对你来说是有意义的。

关于maven - 如何在 Docker 容器中自动重建 Java Webapp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57171618/

相关文章:

maven - Maven 属性的 Gradle 等效项

Django 和 docker : Should we use python virtualenv

java - 从同一个 Dockerfile 运行多个主要方法

tomcat - SSL 中间证书

debugging - 为什么tomcat在使用类似于 "400 Bad Request"的url时返回 "something.com-xyz"

python - Maven有一个pip安装插件吗?

java - 为什么导入到eclipse中的maven项目没有得到 "Maven Dependencies"列表?

Apache Camel 无法创建端点

php - 无法在 docker 容器中安装 Composer 包

postgresql - 安装 amp 文件后 Alfresco 社区损坏