Docker Stack LTS构建时始终从头重新下载并创建GHC问题求解
Stack构建Docker镜像重复下载GHC的原因与解决方法
核心原因
- 用户权限不匹配:fpco/stack-build镜像中预装的GHC、Stack全局缓存都归
stackage用户所有,而Docker构建默认使用root用户执行命令。即使指定了STACK_ROOT指向正确的缓存路径,root用户执行时要么没有读写权限,要么Stack检测到目录所有者与执行用户不一致,判定缓存无效,触发重新下载。 - Stack配置未启用预装GHC:如果
stack.yaml中显式设置了system-ghc: false,或者没有关闭install-ghc选项,Stack会优先自行下载对应版本的GHC,忽略已有的预装版本。 - 版本不匹配:如果本地
stack.yaml声明的LTS版本与基础镜像的lts-17.12不一致,对应的GHC版本也会不同,Stack自然会下载匹配版本的GHC。
修复方案
调整Dockerfile切换执行用户
这是最常见的遗漏配置,修改后的Dockerfile示例:
FROM fpco/stack-build:lts-17.12 as dependencies ENV STACK_ROOT /home/stackage/.stack # 切换为缓存所属的stackage用户 USER stackage # 切换到stackage用户有权限的工作目录 WORKDIR /home/stackage/app # 复制文件时修改所有者为stackage,避免权限问题 COPY --chown=stackage:stackage ./stack.yaml ./package.yaml ./ RUN stack build --dependencies-only
匹配Stack配置
在本地stack.yaml中添加以下配置,强制使用预装GHC,禁止自行安装:
system-ghc: true install-ghc: false
确认版本一致
检查本地stack.yaml的resolver字段值必须为lts-17.12,和基础镜像的LTS版本完全对齐。
内容的提问来源于stack exchange,提问作者Jivan
相关产品推荐
相关产品推荐

