Большой контекст Docker замедляет сборку docker-compose - PullRequest
0 голосов
/ 07 января 2019

У меня есть два изображения, которые используют двухэтапную сборку для сборки кода Scala и копирования артефактов в конечное изображение. Чтобы ускорить сборку, я копирую свой локальный ~/.ivy2 в каталог контекста и оттуда в изображения (~ 1 ГБ). К сожалению, это означает, что даже когда ничего не изменилось и изображения не нужно перестраивать, docker-compose build (или docker build) довольно долго зависает, чтобы скопировать контекст Docker. Конечно, это происходит дважды, по одному разу для каждого изображения.

Есть ли более умный способ сделать это?

Dockerfile:

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"]

1 Ответ

0 голосов
/ 08 января 2019

С 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"]

Чтобы использовать BuildKit до 18.09, вы можете экспортировать переменную среды:

export DOCKER_BUILDKIT=1

или обновите движок с новым значением по умолчанию в /etc/docker/daemon.json:

{ "features": {"buildkit": true} }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...