无法在 docker 图像中缓存 Maven 依赖项
Unable to cache maven dependency in docker image
我正在使用包含所有 maven 配置、密钥、maven 命令的 sh 文件。当我 运行 容器时,它每次都一次又一次地下载依赖项,它无法缓存依赖项。
这是我的 Dockerfile 的样子:
#MVN as build tool
FROM docker.hub.com/maven:3.5.3-jdk-8
#Settings.xml for downloading dependencies from nexus repository
ARG MVN_SETTINGS=settings.xml
#Maven project pom
ARG MVN_POM=pom.xml
#Defining the current working repository
WORKDIR /usr/src/app
#Coping the settings.xml into working directory
COPY ${MVN_SETTINGS} settings.xml
#Coping the pom.xml into working directory
COPY ${MVN_POM} pom.xml
#Download the package and make it cached in docker image
RUN mvn -B -f ./pom.xml -s settings.xml dependency:resolve-plugins dependency:resolve
#Coping the source code into working repository
COPY src .
COPY Test.sh .
#Execute permission
RUN chmod a+x Test.sh
#Entry point for docker container
CMD ./Test.sh
这是 Test.sh 文件
#!bin/bash
mvn test -DtestSuite=src/test/resources/suites/Suite.xml
当我创建 docker 图像和 运行 容器时,它会一次又一次地下载依赖项,每次我 运行 它。
你想要的是不可能的 - 至少使用“常规”Docker 和 Docker 文件 - 请参阅此 以获得解释。
然而,您可以使用 experimental Dockefile syntax to enable caching for RUN
语句达到预期效果:
# syntax = docker/dockerfile:1.0-experimental
FROM docker.hub.com/maven:3.5.3-jdk-8
ARG MVN_SETTINGS=settings.xml
ARG MVN_POM=pom.xml
WORKDIR /usr/src/app
COPY ${MVN_SETTINGS} settings.xml
COPY ${MVN_POM} pom.xml
RUN --mount=type=cache,target=/root/.m2 mvn -B -f ./pom.xml -s settings.xml dependency:resolve-plugins dependency:resolve
COPY src .
COPY Test.sh .
RUN chmod a+x Test.sh
CMD ./Test.sh
上面的 Docker 文件将启用 /root/.m2
目录的缓存。该命令每次仍然会 运行 ,但不会重新下载依赖项。也就是说,此 Docker 文件不适用于“常规”Docker。它需要 BuildKit.
我还建议使用 BuildX plugin 并使用 docker buildx build
构建映像,以便在构建引擎之间轻松切换而无需设置和取消设置环境变量。
我正在使用包含所有 maven 配置、密钥、maven 命令的 sh 文件。当我 运行 容器时,它每次都一次又一次地下载依赖项,它无法缓存依赖项。
这是我的 Dockerfile 的样子:
#MVN as build tool
FROM docker.hub.com/maven:3.5.3-jdk-8
#Settings.xml for downloading dependencies from nexus repository
ARG MVN_SETTINGS=settings.xml
#Maven project pom
ARG MVN_POM=pom.xml
#Defining the current working repository
WORKDIR /usr/src/app
#Coping the settings.xml into working directory
COPY ${MVN_SETTINGS} settings.xml
#Coping the pom.xml into working directory
COPY ${MVN_POM} pom.xml
#Download the package and make it cached in docker image
RUN mvn -B -f ./pom.xml -s settings.xml dependency:resolve-plugins dependency:resolve
#Coping the source code into working repository
COPY src .
COPY Test.sh .
#Execute permission
RUN chmod a+x Test.sh
#Entry point for docker container
CMD ./Test.sh
这是 Test.sh 文件
#!bin/bash
mvn test -DtestSuite=src/test/resources/suites/Suite.xml
当我创建 docker 图像和 运行 容器时,它会一次又一次地下载依赖项,每次我 运行 它。
你想要的是不可能的 - 至少使用“常规”Docker 和 Docker 文件 - 请参阅此
然而,您可以使用 experimental Dockefile syntax to enable caching for RUN
语句达到预期效果:
# syntax = docker/dockerfile:1.0-experimental
FROM docker.hub.com/maven:3.5.3-jdk-8
ARG MVN_SETTINGS=settings.xml
ARG MVN_POM=pom.xml
WORKDIR /usr/src/app
COPY ${MVN_SETTINGS} settings.xml
COPY ${MVN_POM} pom.xml
RUN --mount=type=cache,target=/root/.m2 mvn -B -f ./pom.xml -s settings.xml dependency:resolve-plugins dependency:resolve
COPY src .
COPY Test.sh .
RUN chmod a+x Test.sh
CMD ./Test.sh
上面的 Docker 文件将启用 /root/.m2
目录的缓存。该命令每次仍然会 运行 ,但不会重新下载依赖项。也就是说,此 Docker 文件不适用于“常规”Docker。它需要 BuildKit.
我还建议使用 BuildX plugin 并使用 docker buildx build
构建映像,以便在构建引擎之间轻松切换而无需设置和取消设置环境变量。