每次运行 compose 时,如何重新部署 jar 并将其放入 docker 映像中?

Posted

技术标签:

【中文标题】每次运行 compose 时,如何重新部署 jar 并将其放入 docker 映像中?【英文标题】:How do I have my jar re-deployed and put into docker image every time I run compose? 【发布时间】:2021-12-17 15:43:32 【问题描述】:

所以我知道有很多关于这些主题的教程,包括 docker 和 maven,但是我在将它们组合在一起时有些困惑。

我创建了一个多模块 Maven 项目,其中包含 2 个模块、2 个 spring 应用程序,我们称它们为应用程序 1 和应用程序 2。

通过 IntelliJ IDEA 绿色“运行”按钮启动彼此工作正常,现在我想自动化并通过 docker 运行。

我的 Dockerfile 在这两种情况下看起来都一样: (在两个模块中都是一样的,只是 JAR 名称不同)

FROM adoptopenjdk:11-jre-hotspot
MAINTAINER *my name here lol*
ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.9.0/wait /wait
RUN chmod +x /wait
ARG JAR_FILE=target/*.jar
COPY $JAR_FILE application1-0.0.1-SNAPSHOT-jar-with-dependencies.jar
ENTRYPOINT ["java","-jar","/application1-0.0.1-SNAPSHOT-jar-with-dependencies.jar"]
CMD /wait && /*.jar

我也有 docker-compose:

version: '2.1'
services:
  application1:
    container_name: app1
    build:
      context: ../app1
    image: docker.io/myname/app1:latest
    hostname: app1
    ports:
      - "8080:8080"
    networks:
      - spring-cloud-network-app1
  application2:
    container_name: app2
    build:
      context: ../app2
    depends_on:
      application1:
        condition: service_started
    links:
      - application1
    image: docker.io/myname/app2:latest
    environment:
      WAIT_HOSTS: application1:8080
    ports:
      - "8070:8070"
    networks:
      - spring-cloud-network-app2
networks:
  spring-cloud-network-app1:
    driver: bridge
  spring-cloud-network-app2:
    driver: bridge

我目前做的是:

我为每个模块运行 maven 包,并在两个目标文件夹中接收“application1(-2)-0.0.1-SNAPSHOT-jar-with-dependencies.jar”等文件。 “docker build -t springio/app1.” "docker-compose up --build"

它有效,但我觉得我做了一些额外的步骤。 我怎样才能做这个项目,以便我只需要运行 docker compose? (每次我更改代码后)

再一次,我知道这是一件很简单的事情,但我有点失去了逻辑。

谢谢!

附言 啊,关于“...docker-compose-wait/releases/download/2.9.0/wait /wait” 重要的是应用程序一个接一个地启动,尝试了不同的解决方案,不幸的是,它并没有像我想的那样好用。但我想我会保持原样。

【问题讨论】:

在这种情况下使用 Docker / Compose 有什么好处?为什么不继续从 IDE 中启动应用程序(同时积极开发)? @slauth 好问题,基本上我可以称之为“为了在 webdev 领域了解更多” 好吧,你设法让它工作了。但我会说它并不完全适合交互式开发。我有时使用docker-compose 是为了启动一些支持服务(如数据库)。 顺便说一句,“应用一个接一个地启动很重要”——这不是一件好事,你可以努力改善这种情况。 好吧,你设法让它工作了确实,但我每次都必须重新创建 jar,想知道如何自动完成它 【参考方案1】:

所以,如果有人想知道如何做我所问的事情,答案是:您需要多阶段构建 Dockerfile。 它看起来像这样:

#
# Build stage
#
FROM maven:3.6.0-jdk-11-slim AS build
COPY src /home/app/src
COPY pom.xml /home/app
RUN mvn -f /home/app/pom.xml clean package

#
# Package stage
#
FROM openjdk:11-jre-slim
COPY --from=build /home/app/target/demo-0.0.1-SNAPSHOT.jar /usr/local/lib/demo.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/usr/local/lib/demo.jar"]

它的作用基本上是首先创建一个 jar 文件,将其复制到打包阶段并最终运行。 这允许您通过仅运行 docker compose 在 docker 中运行您的应用程序。

【讨论】:

以上是关于每次运行 compose 时,如何重新部署 jar 并将其放入 docker 映像中?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Keycloak 会不断重新部署相同的 .jar 文件?

Postgres 和 Docker 在文件更改时重新部署

开始使用chef,并在部署时运行composer install

jar包打成docker镜像部署

使用docker compose部署postgreSQL数据库

如何在系统启动时运行 docker-compose up -d?