Во-первых 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