【发布时间】:2019-09-04 09:30:04
【问题描述】:
我已经构建了常见的mavne依赖作为基础docker镜像,但是当我构建一个项目Dockerfile时,它仍然会下载依赖,这需要很长时间才能构建。
【问题讨论】:
-
运行您自己的 Nexus/Artifactory 服务器来管理和缓存依赖项。
我已经构建了常见的mavne依赖作为基础docker镜像,但是当我构建一个项目Dockerfile时,它仍然会下载依赖,这需要很长时间才能构建。
【问题讨论】:
将maven-dependency-plugin、maven's offline mode 的目标go-offline 与docker multistage builds 结合起来。
参考Dockerfile 可以是:
# Step : Test and package
FROM maven:3.5.3-jdk-8-alpine as builder
WORKDIR /build
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src/ /build/src/
# -o flag will instruct maven to build on offline mode
RUN mvn -o package
# Step : Package image
FROM openjdk:8-jre-alpine
EXPOSE 4567
CMD exec java $JAVA_OPTS -jar /app/my-app.jar
COPY --from=builder /build/target/*jar-with-dependencies.jar /app/my-app.jar
调用dependency:go-offline 将在容器的本地存储库中获取所需的工件。感谢 docker 层缓存,这一步将被缓存,因此在新的构建尝试中将被跳过。
一个重要的注意事项是,复制 pom.xml 应该先于源代码复制,因为对 pom.xml 的更改必须触发新的 maven 工件拉取,因为项目的依赖项可能已更改。
编辑:请注意,根据您的pom.xml,您可能会遇到open Maven Dependency plugin issue,在该open Maven Dependency plugin issue 上,某些依赖项未从go-offline 目标中获取应该 ,导致构建失败。作为一种解决方法,您可以尝试Romain's answer。
【讨论】:
mvn package 命令上添加-o 标志和编辑部分的信息。
使用 docker experimental features 和 buildit 您可以在构建过程中挂载(共享)缓存卷,例如:
# syntax = docker/dockerfile:experimental
FROM fabric8/maven-builder
...
RUN --mount=type=cache,target=/root/.m2 mvn versions:set -DnewVersion=1.1.43 && \
mvn clean install ...
【讨论】: