如何对依赖Maven本地存储库的Java应用程序进行Dockerize



我有一个Java Spring Boot web应用程序,我想使用Docker将其容器化。在Docker构建过程中,我很难让mvn install命令工作,因为我的项目依赖于我编写的其他一些Maven项目,这些项目安装在我的本地/.m2文件夹中,但在Maven中央存储库中不可用。我希望避免将这些本地项目添加到公共Maven中央存储库中,因为它们是专门为支持这个Spring Boot应用程序而存在的,并且我希望将它们保留为私有项目。

如果我没有使用Docker,我可以通过构建一个具有依赖关系的JAR,然后部署.jar文件来解决这个问题。有什么方法可以让我在Docker构建过程中包含这些本地依赖项吗?

以下是我尝试运行的简单Dockerfile:

# Step 1: Build with Maven
FROM maven:3.5-jdk-8-alpine
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
RUN mvn clean install

# Step 2: Run jar file with Java
FROM openjdk:8-alpine
WORKDIR /usr/src/myapp
COPY --from=0 /usr/src/myapp/target/myapp-1.0-SNAPSHOT.jar ./myapp.jar
ENTRYPOINT ["java", "-jar", "myapp.jar"]

我运行这个构建命令:

docker build -t myspringapp .

它错误地显示以下消息:

[ERROR] Failed to execute goal on project server: Could not resolve dependencies for project 
com.website:myapp:jar:1.0-SNAPSHOT: The following artifacts could not be resolved: 
com.website:dependency1:jar:0.1.0, com.website:dependency2:jar:0.1.0, 
com.website:dependency3:jar:0.1.0: 
Could not find artifact com.website:dependency1:jar:0.1.0 in central 
(https://repo.maven.apache.org/maven2) -> [Help 1]

作为一个替代问题,我可以在我的开发机器上运行mvn clean install命令来生成jar文件,然后跳过Docker映像的整个Maven构建部分吗?我的容器仍然能够在自动伸缩场景中复制自己吗如果将项目与其Docker镜像/容器分开构建,我会损失什么吗

最简单的方法是将.m2目录放在Docker构建上下文中,并确保Dockerfile的构建阶段将COPY.m2放在基本maven映像所期望的位置。这样,构建阶段就不需要下载您的私有JAR文件。

回答你的另一个问题,是的。这不是12个因素,但在Docker生态系统之外进行JAR构建是绝对可行的,然后只将预构建的JAR文件COPY到映像中。

相关内容

最新更新