Haskell 和 Docker 合理的部署图像大小?
Haskell and Docker reasonable deployed image size?
我曾尝试使用此 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
复制的内容。
我曾尝试使用此 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
.
我认为数百 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
复制的内容。