我正在尝试使用docker自动化maven构建.我想要构建的项目花了将近20分钟来下载所有依赖项,所以我尝试构建一个可以缓存这些依赖项的docker镜像,但它似乎并没有保存它.我的Dockerfile是
FROM maven:alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
ADD pom.xml /usr/src/app
RUN mvn dependency:go-offline
Run Code Online (Sandbox Code Playgroud)
图像构建,它确实下载了所有内容.但是,生成的图像与基本maven:alpine
图像的大小相同,因此它似乎没有缓存图像中的依赖项.当我尝试使用图像时,mvn compile
它会经历整整20分钟的重新下载所有内容.
是否可以构建一个缓存我的依赖项的maven图像,这样每次我使用图像执行构建时都不必下载它们?
我正在运行以下命令:
docker build -t my-maven .
docker run -it --rm --name my-maven-project -v "$PWD":/usr/src/mymaven -w /usr/src/mymaven my-maven mvn compile
Run Code Online (Sandbox Code Playgroud)
我的理解是,RUN
在docker构建过程中的任何内容都会成为生成的图像的一部分.
我正在使用以下内容的 Docker 容器中运行测试Dockerfile
:
FROM maven:3.5.3-jdk-8
ENV APP_DIR=/app
RUN mkdir -p $APP_DIR
WORKDIR $APP_DIR
COPY pom.xml .
RUN mvn -B dependency:resolve -Dclassifier=test
COPY . $APP_DIR
RUN mvn -B test-compile compile
ENTRYPOINT ["mvn", "test"]
Run Code Online (Sandbox Code Playgroud)
它确实在构建过程中下载了一些依赖项。问题是mvn test
在 Docker 容器中运行时,它会下载一些与 Surefire 插件相关的依赖项。在构建过程中可以使用什么 Maven 命令来下载它们?该项目只是一个使用向导创建的基本应用程序,其中包含以下内容pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>my-app</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Run Code Online (Sandbox Code Playgroud)