--mount=type=cache 在 buildkit 中
--mount=type=cache in buildkit
我正在尝试让 Maven 离线构建在 docker 容器中运行。我已经启用了 buildkit。我已经 运行 mvn dependency:go-offline -s ~/checkouts/settings.xml
将依赖项缓存在主机的 /root/.m2
中。我想在构建maven项目的容器中使用它。
这是我的Docker文件:
#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
这个 Docker 文件时,出现以下错误:
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
需要安装到 docker 容器环境中的 /root/.m2
上?当我 运行 mvn -o install
它需要引用已安装的 /root/.m2
?
我添加了 tail -f /dev/null
,删除了第二个构建阶段,并将 mvn install
更改为 mvn version
并且缓存安装指令完好无损,以便对其进行调试。我看到容器内的 /root/.m2 上没有安装任何东西。它是空的。 (不确定这是否是调试它的正确方法,因为它可能在构建图像后被卸载)
最好将 --mount=type=cache
视为 docker 中的命名卷,由 BuildKit 管理,如果 BuildKit 缓存已满或 p运行e 已满,则可能会被删除要求。下次您 运行 构建时,同名卷可能可用,从而显着减少下载依赖项所花费的构建时间。虽然非常有用,但这似乎不是您在这里寻找的东西。要使用这样的缓存,您需要在 Dockerfile 中包含 go-offline
作为较早的步骤:
#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 可能会再次尝试通过网络连接。
我正在尝试让 Maven 离线构建在 docker 容器中运行。我已经启用了 buildkit。我已经 运行 mvn dependency:go-offline -s ~/checkouts/settings.xml
将依赖项缓存在主机的 /root/.m2
中。我想在构建maven项目的容器中使用它。
这是我的Docker文件:
#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
这个 Docker 文件时,出现以下错误:
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
需要安装到 docker 容器环境中的 /root/.m2
上?当我 运行 mvn -o install
它需要引用已安装的 /root/.m2
?
我添加了 tail -f /dev/null
,删除了第二个构建阶段,并将 mvn install
更改为 mvn version
并且缓存安装指令完好无损,以便对其进行调试。我看到容器内的 /root/.m2 上没有安装任何东西。它是空的。 (不确定这是否是调试它的正确方法,因为它可能在构建图像后被卸载)
最好将 --mount=type=cache
视为 docker 中的命名卷,由 BuildKit 管理,如果 BuildKit 缓存已满或 p运行e 已满,则可能会被删除要求。下次您 运行 构建时,同名卷可能可用,从而显着减少下载依赖项所花费的构建时间。虽然非常有用,但这似乎不是您在这里寻找的东西。要使用这样的缓存,您需要在 Dockerfile 中包含 go-offline
作为较早的步骤:
#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 可能会再次尝试通过网络连接。