如何从外部回购使用docker-compose和maven snaphot依赖关系

我有几个Java组件(WAR),他们都暴露Web服务,他们碰巧使用相同的消息对象(DTOs)。

这些组件都与DTO共享一个通用的Maven依赖项,我们称之为“messaging-dtos.jar”。 这个常见的依赖项有一个版本号,例如messaging-dtos-1.2.3.jar,其中1.2.3是该工件的maven版本,该工具发布在nexus库等文件中。

在maven的世界里,docker放在一边,使用封闭的版本依赖关系可能会非常繁琐。 解决scheme是maven SNAPSHOTS。 例如,当您使用Eclipse IDE,并将依赖项设置为SNAPSHOT版本时,这将导致IDE从当前工作空间取代版本,从而节省时间,而不必在每次创build一个小型文件时closures某个版本更改。

现在,我不知道如何让这个开发周期与docker和docker-compose一起工作。 我有“Component A”,它存在于自己的git仓库中,而messaging-dtos.jar存在于另一个git仓库中,并且以nexus的forms发布。

我的Dockerfile simpy在某个时候执行了一个RUN mvn clean install ,为这个依赖项(我们使用Dockerfiles进行实际的部署,但是对于我们使用docker-compose的本地环境)提供了closures的版本。 这适用于封闭的版本,但不适用于SNAPSHOTS(至less不适用于本地SNAPSHOT,我可以在联机中发布SNAPSHOT,但是创build了另一组问题,用不同的内容覆盖相同的SNAPSHOT等,在那里,我想不要回来)。

我一直在考虑在某些时候使用docker-compose卷,也许是为了装载我的本地.m2文件,所以ComponentA可以在构build时find快照依赖项,但是这并不足够“干净”,构build会部分取决于Dockerfile中指定的任何内容,部分取决于本地构build的东西。 我不确定这是否是正确的方法。

有任何想法吗? 谢谢!

我build议维护两种方法:一种用于您当地的开发环境(即您的机器),另一种用于在您当前的CI工具中构build。

  • 为您的本地开发环境:

    1. 一个Dockerfile,为您的War应用程序提供系统需求(例如Tomcat)
    2. docker-compose使用构build的war应用程序从Eclipse或任何IDE安装卷。
  • 对于CI(不是你的开发环境):

    1. 一个非常类似的Dockerfile,但可以build立你的应用程序(安装Maven)

一个实际的例子

我使用dockerfunction: 多阶段构build 。 Dev和CI的一个单独的Dockerfile可能被分割,但我更愿意只维护一个:

 FROM maven as build ARG LOCAL_ENV=false COPY ./src /app/ RUN mkdir /app/target/ RUN touch /app/target/app.war WORKDIR /app # Run the following only if we are not in Dev Environment: RUN test $LOCAL_ENV = "false" && mvn clean install FROM tomcat COPY --from=build /app/target/app.war /usr/local/tomcat/webapps 

多级构build可以节省大量的磁盘空间,从构build中丢弃所有的东西,除了COPY --from= from COPY --from= 'ed。

然后,在Dev env中使用docker-compose.yml

 version: "3" services: app: build: context: . args: LOCAL_ENV: true volumes: - ./target/app.war:/usr/local/tomcat/webapps/app.war 

build立在CI(不是你的本地机器):

 # Will run `mvn clean install`, fetching whatever it needs from Nexus and so on. docker build . 

在本地环境(本地机器)中运行:

 # Will inject the war that should be available after a build from your IDE docker-compose up