我有一个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
到映像中。