当前位置: 首页 > 知识库问答 >
问题:

装载卷作为多阶段构建的一部分

瞿文柏
2023-03-14

如何安装卷来存储我的. m2存储库,这样我就不必在每次构建时下载互联网?

我的构建是一个多阶段构建:

FROM maven:3.5-jdk-8 as BUILD

COPY . /usr/src/app
RUN mvn --batch-mode -f /usr/src/app/pom.xml clean package

FROM openjdk:8-jdk
COPY --from=BUILD /usr/src/app/target /opt/target
WORKDIR /opt/target

CMD ["/bin/bash", "-c", "find -type f -name '*.jar' | xargs java -jar"]

共有2个答案

巫马化
2023-03-14

尽管@Marek Obuchowicz的答案仍然有效,但这里有一个小的更新。

首先将此行添加到多克文件:

# syntax=docker/dockerfile:1

您可以像这样以内联方式设置DOCKER_BUILDKIT

DOCKER_BUILDKIT=1 docker build -t mytag .

我还建议将依赖项解析和打包阶段分开,这样您就可以充分利用Docker层缓存(如果pom.xml没有任何变化,它将使用已下载依赖项的缓存层)。完整的Dockerfile可以如下所示:

# syntax=docker/dockerfile:1
FROM maven:3.6.3-openjdk-17 AS MAVEN_BUILD
COPY ./pom.xml ./pom.xml
RUN --mount=type=cache,target=/root/.m2 mvn dependency:go-offline -B
COPY ./src ./src
RUN --mount=type=cache,target=/root/.m2 mvn package

FROM openjdk:17-slim-buster
EXPOSE 8080
COPY --from=MAVEN_BUILD /target/myapp-*.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar","-Xms512M","-Xmx2G","-Djava.security.egd=file:/dev/./urandom"]
蓝慈
2023-03-14

你可以用Docker做到这一点

export DOCKER_BUILDKIT=1

然后,您需要启用实验性的泊坞文件前端功能,方法是将第一行添加为Dockerfile:

# syntax=docker/dockerfile:experimental

之后,您可以调用带有缓存装载的RUN命令。缓存装载在构建期间保持持久:

RUN --mount=type=cache,target=/root/.m2 \
    mvn --batch-mode -f /usr/src/app/pom.xml clean package
 类似资料:
  • 多阶段构建 之前的做法 在 Docker 17.05 版本之前,我们构建 Docker 镜像时,通常会采用两种方式: 全部放入一个 Dockerfile 一种方式是将所有的构建过程编包含在一个 Dockerfile 中,包括项目及其依赖库的编译、测试、打包等流程,这里可能会带来的一些问题: 镜像层次多,镜像体积较大,部署时间变长 源代码存在泄露的风险 例如,编写 app.go 文件,该程序输出 H

  • Docker的口号是 Build,Ship,and Run Any App,Anywhere,在我们使用 Docker 的大部分时候,的确能感觉到其优越性,但是往往在我们 Build 一个应用的时候,是将我们的源代码也构建进去的,这对于类似于 golang 这样的编译型语言肯定是不行的,因为实际运行的时候我只需要把最终构建的二进制包给你就行,把源码也一起打包在镜像中,需要承担很多风险,即使是脚本语

  • 为什么buildspec文件支持多个构建阶段<代码>安装、预构建、构建、后构建?如果我将所有构建步骤都放在一个阶段中,我是否做错了什么?在这些阶段,除了保持某种结构之外,还有什么非常有用的东西吗?

  • 问题内容: 如何在中指定多阶段构建? 对于每个变体(例如dev,prod …),我都有一个包含2个docker文件的多阶段构建: 开发人员:+ 或产品:+ 文件(所有变体通用): 档案: 档案: 没有docker-compose,我可以构建为: 根据compose-file doc,我可以指定要构建的Dockerfile。 但是,如何在其中指定2个Dockerfile (用于多阶段构建)? 问题答

  • 实战多阶段构建 Laravel 镜像 本节适用于 PHP 开发者阅读。 准备 新建一个 Laravel 项目或在已有的 Laravel 项目根目录下新建 Dockerfile .dockerignore laravel.conf 文件。 在 .dockerignore 文件中写入以下内容。 .idea/.git/vendor/node_modules/public/js/public/css/ya

  • FROM alpine:3.9.6 as build ​ # 构建xlswriter扩展,根据自身需要替换版本号 ENV XLSWRITER_VERSION 1.3.4.1 ​ RUN apk update \ && apk add --no-cache php7-pear php7-dev zlib-dev re2c gcc g++ make curl \ && curl -fs