我正在创建一个可以构建 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
我需要在自己的行中包含某个包注册表文件吗?据我所知,我的构建应该几乎是即时的,而不是需要几分钟才能完成。