gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 23:11:41 25 4
gpt4 key购买 nike

我需要提供 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com