gpt4 book ai didi

scala - 大型 Docker 上下文会减慢 docker-compose 构建速度

转载 作者:行者123 更新时间:2023-12-01 08:42:57 26 4
gpt4 key购买 nike

我有两个图像,它们使用两阶段构建来构建 Scala 代码并将工件复制到最终图像。为了加快构建速度,我将本地 ~/.ivy2 复制到上下文目录,然后从那里复制到图像 (~1GB)。不幸的是,这意味着即使什么都没有改变并且图像不需要重新构建,docker-compose build(或 docker build)也会挂起很长一段时间复制 Docker 上下文。这当然会发生两次,每张图片一次。

有没有更聪明的方法来做到这一点?

docker 文件:

FROM openjdk:8

RUN apt-get update &&\
apt-get install -y apt-transport-https gnupg2 &&\
echo "deb https://dl.bintray.com/sbt/debian /" | tee -a /etc/apt/sources.list.d/sbt.list &&\
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 642AC823 &&\
apt-get update &&\
apt-get install -y sbt=1.1.6

COPY ivy-cache/ /root/.ivy2

COPY app/source/ /app/source

RUN cd /app/source &&\
sbt assembly &&\
cp target/scala-2.11/my-app-*.jar /app/my-app.jar

FROM gettyimages/spark:2.3.1-hadoop-3.0

COPY --from=0 /app/my-app.jar /app/my-app.jar

CMD ["spark-submit", "--master", "local", "/app/my-app.jar"]

最佳答案

在 18.09 中,docker 包含了 BuildKit。 BuildKit 本身将缓存以前的上下文,并且只在后台发送与 rsync 等效的差异。

对于这种特定情况,您可以使用一些实验性功能在依赖项缓存中挂载,作为使用 RUN --mount 语法的命名卷的等价物。缓存目录永远不会进入镜像,但会用于以后的构建,并且当您引入新的依赖项时,它的行为就像本地构建一样,仅下载新的依赖项。

# syntax=docker/dockerfile:experimental
FROM openjdk:8 as build

RUN apt-get update &&\
apt-get install -y apt-transport-https gnupg2 &&\
echo "deb https://dl.bintray.com/sbt/debian /" | tee -a /etc/apt/sources.list.d/sbt.list &&\
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 642AC823 &&\
apt-get update &&\
apt-get install -y sbt=1.1.6

COPY app/source/ /app/source

RUN --mount=type=cache,target=/root/.ivy2 \
cd /app/source &&\
sbt assembly &&\
cp target/scala-2.11/my-app-*.jar /app/my-app.jar

FROM gettyimages/spark:2.3.1-hadoop-3.0 as release

COPY --from=build /app/my-app.jar /app/my-app.jar

CMD ["spark-submit", "--master", "local", "/app/my-app.jar"]

要在 18.09 下使用 BuildKit,您可以导出一个环境变量:

export DOCKER_BUILDKIT=1

或者使用/etc/docker/daemon.json 中的新默认值更新引擎:

{ "features": {"buildkit": true} }

关于scala - 大型 Docker 上下文会减慢 docker-compose 构建速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54069982/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com