You need to enable JavaScript to run this app. Docker Stack LTS构建时始终从头重新下载并创建GHC问题求解
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 02:36:07