Это изображение предназначено для использования с Haskell Интеграция стека Docker . Один очень разумный путь - просто использовать этот путь для создания двоичного файла в каталоге системы хоста, а затем использовать вторую половину этого Dockerfile для упаковки двоичного файла в Docker образ.
Если вы посмотрите при том, что создается, это динамически связанный двоичный файл, который имеет зависимость не по умолчанию. Если я изменю ubuntu
на alpine
(временно) и поменяю ENTRYPOINT
на CMD
, тогда я смогу запустить
$ docker run --rm 101681db8d96 ldd /Main
Error loading shared library libgmp.so.10: No such file or directory (needed by /Main)
Это также не начнется с musl lib c, который упакован в образ Alpine (непонятно почему), поэтому вам нужно установить пакет совместимости GNU lib c, а также пакет libgmp.
(Поскольку это двоичный файл с динамической связью, вы также не можете запустить в образе FROM scratch
, если вы не хотите вручную установить GNU lib c и другие необходимые вам вспомогательные библиотеки.
Для этапа сборки, как следует из названия, он включает полная копия LTS Haskell 15.4 , но для того, чтобы найти его, нужно немного покопаться в изображении.
$ docker run --rm -it fpco/stack-build:lts-15.4 sh
В этой оболочке вы можете найти установку Stack в /home/stackage/.stack
; указание переменной окружения STACK_ROOT
на этот каталог заставит команду stack
найти ее. Это избавит от необходимости загружать gh c и остальную часть среды LTS Haskell при повторной сборке. сделал это, остальные ваши ckerfile работает почти так же, как вы показали.
Это оставляет нам окончательный Dockerfile:
FROM fpco/stack-build:lts-15.4 as haskell
# Tell `stack` where to find its content (not in $HOME)
ENV STACK_ROOT /home/stackage/.stack
WORKDIR /opt/build
COPY Main.hs .
RUN stack ghc --package process -- Main.hs
# Switch Ubuntu back to Alpine
FROM alpine:latest
# Add the libraries we need to run the application
RUN apk add libc6-compat gmp
COPY --from=haskell /opt/build/Main /Main
CMD ["/Main"]