2

我正在创建一个可以构建 haskell 程序的 Dockerfile。Dockerfile 使用 ubuntu focus 作为基础镜像,安装 ghcup,然后构建一个 haskell 程序。我这样做有多种原因;它可以支持低配置的 CI 环境,并且可以帮助尝试构建复杂项目的新开发人员。

为了加快构建时间,我将 docker v20 与 buildkit 一起使用。我有一系列这样的事件(这是一个很长的文件,但这段摘录是相关的部分):

# installs haskell
WORKDIR $HOME
RUN git clone https://github.com/haskell/ghcup-hs.git
WORKDIR ghcup-hs
RUN BOOTSTRAP_HASKELL_NONINTERACTIVE=NO ./bootstrap-haskell
#RUN source ~/.ghcup/env  # Uh-oh: can't do this.
# We recreate the contents of ~/.ghcup/env
ENV PATH=$HOME/.cabal/bin:$HOME/.ghcup/bin:$PATH

# builds application
COPY application $HOME/application
WORKDIR $HOME/application
RUN mkdir -p logs
RUN --mount=type=cache,target=$HOME/.cabal \
    --mount=type=cache,target=$HOME/.ghcup \
    --mount=type=cache,target=$HOME/application/dist-newstyle \
    cabal build |& tee logs/configure.log

但是当我在中更改一些非代码文件(例如 README.md)application并构建我的 docker 映像时...

DOCKER_BUILDKIT=1 docker build -t application/application:1.0 .

...这需要相当多的时间,并且来自 cabal install的输出cabal build 包括很多Downloading [blah]随后的Building/ Installing/消息。Completed

但是,当我进入容器并输入cabal build时,它会快得多(它已经构建好了):

host$ docker run -it application/application:1.0
container$ cabal build  # this is fast

我希望它在前一种情况下也一样快。由于我并没有真正更改代码文件,并且依赖项都已下载,并且由于我使用的是RUN --mount.

是否有我的--mount=type=cache条目未涵盖的文件?--mount=type=cache我需要在自己的行中包含某个包注册表文件吗?据我所知,我的构建应该几乎是即时的,而不是需要几分钟才能完成。

4

0 回答 0