Haskell和Docker合理部署了图像大小?

时间:2018-03-11 16:02:19

标签: windows google-app-engine haskell docker haskell-stack

我曾尝试使用此Dockerfile构建在Google App Engine中运行的PoC Happstack可执行文件:

FROM ubuntu:14.04

ENV APP_ROOT=/usr/share/app

RUN apt-get update && apt-get install curl -y && curl -sSL https://get.haskellstack.org/ | sh

COPY . ${APP_ROOT}/
WORKDIR ${APP_ROOT}/
RUN stack setup
RUN stack build

EXPOSE 8000

ENTRYPOINT ["stack","exec","app-exe"]

这可行,我可以部署,但结果图像看起来很大。

我认为stack安装后图片约为450MB,stack setup后约为1.8GB,stack build后约为3GB。

我认为数百MB似乎合理,甚至高达GB。我应该采取不同的方法,也许将生成的可执行文件以某种方式提取到另一个图像,以消除运行时不必要的一切?

1 个答案:

答案 0 :(得分:7)

这非常适合Docker多阶段构建:

https://docs.docker.com/develop/develop-images/multistage-build/

您可以按以下方式申请:

FROM ubuntu:14.04 as mybuild

ENV APP_ROOT=/usr/share/app

RUN apt-get update && apt-get install curl -y && curl -sSL https://get.haskellstack.org/ | sh

COPY . ${APP_ROOT}/
WORKDIR ${APP_ROOT}/
RUN stack setup
RUN stack build

FROM ubuntu:14.04

COPY --from=mybuild /path/to/app-exe /dest/app-exe #edit this line accordingly

EXPOSE 8000

ENTRYPOINT ["stack","exec","app-exe"]

第二张FROM之前的所有内容都未包含在最终图片中,但您使用COPY --from复制的内容除外。