maven - --mount=type=cache 在 buildkit

标签 maven docker dockerfile docker-build

我试图让 maven 离线构建在 docker 容器中工作。我已经启用了 buildkit。我跑了mvn dependency:go-offline -s ~/checkouts/settings.xml缓存 /root/.m2 中的依赖关系的主机。我希望在构建 Maven 项目的容器中使用它。

这是我的 Dockerfile:

#syntax=docker/dockerfile:experimental
FROM maven:3.6.1-jdk-11 AS build
WORKDIR /
COPY . /
RUN --mount=type=cache,target=/root/.m2 mvn -o install 

FROM scratch
COPY --from=build /admin/admin- 
rest/target/admin-rest.war /webapps/ROOT.war

当我尝试 docker build这个 Dockerfile,我收到以下错误:

Plugin org.codehaus.mojo:build-helper-maven-plugin:3.0.0 or one of its dependencies could not be resolved: Cannot access central (https://repo.maven.apache.org/maven2) in offline mode and the artifact org.codehaus.mojo:build-helper-maven-plugin:jar:3.0.0 has not been downloaded from it before. -> [Help 1]



我的 Docker 版本:
Client:
 Version:           18.09.6
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        481bc77
 Built:             Sat May  4 02:35:57 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.1
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.5
  Git commit:       74b1e89
  Built:            Thu Jul 25 21:19:41 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.5
  GitCommit:        bb71b10fd8f58240ca47fbb579b9d1028eea7c84
 runc:
  Version:          1.0.0-rc6+dev
  GitCommit:        2b18fe1d885ee5083ef9f0838fee39b62d653e30
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

我的期望是对的吗/root/.m2从我的主机需要安装到 /root/.m2在 docker 容器环境中?当我运行 mvn -o install需要引用挂载的/root/.m2 ?

我添加了 tail -f /dev/null ,删除了第二个构建阶段并更改了 mvn installmvn version使用完整的缓存安装指令进行调试。我看到容器内没有任何东西安装到/root/.m2 上。它是空的。 (不确定这是否是调试它的正确方法,因为它可能会在构建镜像后被卸载)

最佳答案

最好想到--mount=type=cache就像 docker 中的命名卷一样,由 BuildKit 管理,如果 BuildKit 缓存已满或请求修剪,则可能会被删除。下次运行构建时,可能会使用相同的命名卷,从而显着减少下载依赖项所花费的构建时间。虽然非常有用,但这似乎不是您在此处寻找的内容。要使用这样的缓存,您需要包含 go-offline作为 Dockerfile 中的较早步骤:

#syntax=docker/dockerfile:experimental
FROM maven:3.6.1-jdk-11 AS build
WORKDIR /
# copy just the pom.xml for cache efficiency
COPY ./pom.xml /
# go-offline using the pom.xml
RUN --mount=type=cache,target=/root/.m2 mvn dependency:go-offline
# now copy the rest of the code and run an offline build
COPY . /
RUN --mount=type=cache,target=/root/.m2 mvn -o install 

FROM scratch
COPY --from=build /admin/admin-rest/target/admin-rest.war /webapps/ROOT.war

要将目录从主机安装到容器中,您似乎正在寻找的是绑定(bind)安装。并且使用 BuildKit 的实验设置,这是可用的,但仅适用于构建上下文,而不适用于构建主机上的任何任意目录。为此,您可以将 .m2构建上下文目录中的目录,然后在 Dockerfile 中使用以下行:
RUN --mount=type=bind,source=./.m2,target=/root/.m2,rw mvn -o install
请注意,如果任何依赖项发生更改,Maven 可能会再次尝试通过网络连接。

关于maven - --mount=type=cache 在 buildkit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57581943/

相关文章:

java - Maven Shade 重叠类警告

docker - 如何为我的项目的多个版本共享一个Dockerfile?

docker - 容器自行退出并且无法执行

java - 在 Jenkins 中显示 OWASP Dependency-Check Maven 插件的结果

java - Maven:在一个项目中混合使用 Java 和 Scala

docker - 堆栈服务容器动态主机名

ruby - 在开发模式下,Rails 应用程序的 Docker 容器运行速度非常慢

python - Docker Python 文件输入选择器

docker - 如何保持无限循环运行以不关闭Docker中的容器

java - 通过 Maven 在 Spring Boot 中配置 Activity 配置文件