windows - Haskell 和 Docker 合理部署的镜像大小?

标签 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 似乎是合理的,甚至高达 1 GB。我应该采取不同的方法吗,也许以某种方式将生成的可执行文件提取到另一个图像中以消除运行时不必要的所有内容?

最佳答案

这非常适合 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 复制的内容。

关于windows - Haskell 和 Docker 合理部署的镜像大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49222022/

相关文章:

google-app-engine - 是否可以在 Google appengine 标准环境中使用 Gorilla mux 路由器?

google-app-engine - Google 应用引擎 - 在启动时初始化对象

algorithm - 运算符下计算闭包的高效函数算法

windows - 了解 SystemParametersInfo SPI_SETFOREGROUNDLOCKTIMEOUT

Windows 批处理文件 - 无法设置变量值

windows - 在 WiX 中获取 FILE 的绝对路径

sockets - 从 Socket 句柄构建的惰性 ByteString 无法被延迟使用和 GC

c++ - DeviceIoControl GetLastError 87 (ERROR_INVALID_PARAMETER)

java - gcloud-java。权限_拒绝 : Google Cloud Pub/Sub API (Experimental)

Haskell:处理计算结果