每次运行 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 文件?
开始使用chef,并在部署时运行composer install