--mount = type =构建套件中的缓存

时间:2019-08-20 21:48:03

标签: maven docker dockerfile docker-build

我正在尝试使docker容器中的Maven脱机构建工作。我启用了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时,出现以下错误:

  

插件org.codehaus.mojo:build-helper-maven-plugin:3.0.0或其中之一   依赖关系无法解决:无法访问中央   (https://repo.maven.apache.org/maven2)在离线模式下,   工件org.codehaus.mojo:build-helper-maven-plugin:jar:3.0.0尚未   之前已从中下载。 -> [帮助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需要挂载到docker容器环境中的/root/.m2上?而当我运行mvn -o install时,它需要引用已安装的/root/.m2吗?

我添加了tail -f /dev/null,删除了第二个构建阶段,并使用完整的cache-mount指令将mvn install更改为mvn version以便对其进行调试。我看到没有任何内容挂载到容器内的/root/.m2上。它是空的。 (不确定这是否是调试的正确方法,因为在构建映像后可能会卸载它)

1 个答案:

答案 0 :(得分:5)

最好将--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

要将目录从主机安装到容器中,您似乎要查找的是绑定安装。借助BuildKit的实验设置,该设置可用,但仅适用于构建上下文,不适用于构建主机上的任何任意目录。为此,您可以将.m2目录放置在构建上下文目录中,然后在Dockerfile中使用以下行:

RUN --mount=type=bind,source=./.m2,target=/root/.m2,rw mvn -o install

请注意,如果任何依赖项发生更改,则Maven可能会尝试再次通过网络连接。