在我的Maven应用程序中,我有多个项目:
Application 1
和Application 2
是两个使用core
的项目(例如,这些应用程序是为两个不同的客户构建的)
为了对所有这些进行Docker化,最简单的方法是创建一个多模块项目,但是缺点是我全部都在一个项目中(核心+应用程序1 +应用程序2)。
我希望将核心与它们分开。
此配置的主要问题是core
项目需要在其他两个项目之前构建,而App 1
和App 2
将此项目作为maven依赖项:
App 1
<dependency>
<groupId>it.myorg</groupId>
<artifactId>core-project</artifactId>
<version>1.12.0-SNAPSHOT</version>
</dependency>
如果我尝试将App 1
打包时将其打包,因为在Docker容器中的core-project 1.12.0-SNAPSHOT内部不存在。
我当时正在考虑设置一个“本地Maven存储库”,将内核推到那里,App 1
将从存储库而不是.m2
文件夹中“拉”罐子,但是我不喜欢这种解决方案
我可以提供更多信息,如果我不提供示例,抱歉,但是我的论文现在是白色的:(
文件夹结构
+- Core
--- pom.xml
--- src
+- Application1
--- pom.xml
--- src
我现在要解决的方法是为核心项目创建一个Dockerfile(FROM maven:latest),使用标签构建映像,并在App1的Dockerfile中使用该映像(因此,创建一个多阶段构建,但在两个不同的时刻)。
最好的是
FROM maven:latest as core-builder
## build the core
FROM maven:latest
## Copy jar from builder
因为项目位于单独的文件夹中,所以我无法以这种方式构建核心。我需要先构建del core(运行docker build -t),然后再从中复制。
更新
在@mihai给出正确答案后,我要问它是否可能是这样的结构:
-- myapp-docker
- Dockerfile
- docker-compose.yml
-- core-app
-- application_1
将Dockerfile置于core-app
和application_1
的同一级别上,它完全可以正常工作并且100%工作。唯一的“问题”是我应该将所有项目放在同一个仓库中。
答案 0 :(得分:1)
这是建议的多阶段构建解决方案。
要复制您的设置,我创建了以下结构:
.
├── Dockerfile-app1
├── application1
│ ├── pom.xml
│ └── src
│ └── main
│ ├── resources
│ └── webapp
│ ├── WEB-INF
│ │ └── web.xml
│ └── index.jsp
├── core
│ ├── pom.xml
│ └── src
│ ├── main
│ │ └── java
│ │ └── com
│ │ └── test
│ │ └── App.java
│ └── test
│ └── java
│ └── com
│ └── test
│ └── AppTest.java
在应用程序1的pom.xml文件中,我将依赖项添加到core
:
<dependency>
<groupId>com.test</groupId>
<artifactId>core</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
我将Dockerfile命名为Dockerfile-app1
,这样您就可以拥有多个Dockerfile。
这是Dockerfile-app1:
FROM maven:3.6.0-jdk-8 as build
WORKDIR /apps
COPY ./core .
RUN mvn clean install
FROM maven:3.6.0-jdk-8
# If you comment this out then the build fails because it cannot find the dependency to 'core'
COPY --from=build /root/.m2 /root/.m2
COPY ./application1 ./
RUN mvn clean install
您可能应该在末尾添加一个入口点来运行您的项目,甚至最好再添加一个第三阶段,该阶段仅复制生成的人工制品并运行您的项目(这样最终的图像将不会包含您的原始资料)。
第一阶段仅构建core
子模块。
第二阶段使用第一阶段的结果,仅复制application1的源并进行构建。
通过创建类似的文件application2
,您可以轻松地为Dockerfile-app2
复制此文件。
答案 1 :(得分:0)
由于您正在使用Maven,请尝试dockerfile-maven来生成图像。您不希望在映像中包含任何构建信息(例如依赖项是什么),只需在末尾添加jar。我通常将其与spring-boot-maven-plugin
和repackage
结合使用,以获得完全独立的jar。