Можно ли сохранить промежуточный образ в контейнер и использовать его для других проектов?

Я пишу на Haskell и использую Stack.
Для того, чтобы начать компилировать код надо иметь установленный stack и в корне разработки прописать stack setup. Это скачивает компилятор и позволяет приступить к сборке.
Если я хочу завернуть свои приложения в docker. То мне приходится проходить скачивание stack, его инициализацию, и, как результат, сборку приложения.
Из-за этого приложение, которое после сборки занимает от силы пару мегабайт начинает весить 6 гигиов.

Можно ли как-то создать контейнер с предустановленным stack и использовать его для сборки контейнеров?
Чтобы иметь возможность после сборки удалить лишние инструменты и оставить в образе приложения только само приложение для запуска.
  • Вопрос задан
  • 134 просмотра
Пригласить эксперта
Ответы на вопрос 2
@zohan1993
devops
для минимизации образа с приложением
multistage-build

этап 1
устанавливаете все необходимые инструменты и зависимости для компиляции приложения
выполняете компиляцию приложения

этап 2
устанавливаете все зависимости необходимые для работы приложения
копируете готовое приложение в новый образ
Ответ написан
wiz
@wiz
Ортодоксальный хаскелит
Во-первых stack имеет родной способ сборки через докер: https://docs.haskellstack.org/en/stable/docker_int...

Если хочется собирать докер-образы с некоторыми пред-собранными зависимостями, можно взять образ используемый в stack, сбилдить там зависимости проекта и уже результат использовать для сборки в докере.

Если нужно собирать приложение в докере, а потом деплоить только бинарь, то это уже multistage.
Ну такой вот примерно рецепт усредненный, потому что вариаций масса:

FROM fpco/stack-build:lts-16.20 as build

WORKDIR /opt/source
RUN stack --resolver=lts-16.20 --system-ghc install example-exe

FROM fpco/stack-run
WORKDIR /opt/dist
COPY --from=build-env /home/user/.local/bin/example-exe .

CMD ./example-exe
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы