Docker环境下Yesod构建失败问题求助
问题
尝试按照Yesod官方快速入门文档在Docker环境中构建Yesod项目,编写的Dockerfile内容如下:
# Dockerfile FROM ubuntu:22.04 RUN apt-get update RUN apt-get install curl -y RUN curl -sSL https://get.haskellstack.org/ | sh RUN stack new my-project yesodweb/sqlite RUN cd my-project && stack install yesod-bin --install-ghc RUN cd my-project && stack build
执行docker build --tag host_yesod --file Dockerfile .命令时,前6步正常完成,但第7步cd my-project && stack build执行失败,耗时100.7秒。错误信息如下:
100.6 Error: [S-7282] 100.6 Stack failed to execute the build plan. 100.6 100.6 While executing the build plan, Stack encountered the error: 100.6 100.6 [S-7011] 100.6 While building package language-javascript-0.7.1.0 (scroll up to its section to see the 100.6 error) using: 100.6 /root/.stack/setup-exe-cache/x86_64-linux-tinfo6/Cabal-simple_6HauvNHV_3.6.3.0_ghc-9.2.8 --verbose=1 --builddir=.stack-work/dist/x86_64-linux-tinfo6/ghc-9.2.8 build --ghc-options "" 100.6 Process exited with code: ExitFailure 1
未在日志中找到具体错误线索,完整日志已归档。
解决方案
1. 补充系统构建依赖
Ubuntu 22.04镜像默认缺少Haskell包编译所需的基础工具和系统库,修改Dockerfile,在安装curl后添加必要依赖,同时合并RUN指令减少镜像层数:
FROM ubuntu:22.04 RUN apt-get update && apt-get install -y \ curl \ build-essential \ libgmp-dev \ zlib1g-dev RUN curl -sSL https://get.haskellstack.org/ | sh RUN stack new my-project yesodweb/sqlite WORKDIR my-project RUN stack install yesod-bin --install-ghc RUN stack build
2. 升级Stack到最新版本
旧版Stack可能与部分Haskell包存在兼容性问题,替换原Stack安装命令为升级命令:
RUN curl -sSL https://get.haskellstack.org/ | sh -s -- --upgrade
3. 配置镜像源加速构建(可选)
若处于国内网络环境,添加国内Hackage镜像源可以大幅提升依赖下载速度,在Dockerfile中加入:
RUN mkdir -p /root/.stack && echo 'resolver: lts-20.25' > /root/.stack/config.yaml \ && echo 'package-indices:' >> /root/.stack/config.yaml \ && echo ' - download-package-list: true' >> /root/.stack/config.yaml \ && echo ' hackage-security: true' >> /root/.stack/config.yaml \ && echo ' url: https://mirrors.tuna.tsinghua.edu.cn/hackage/' >> /root/.stack/config.yaml
注意选择与项目匹配的resolver版本,避免依赖冲突。
4. 指定兼容的language-javascript版本
如果特定版本的language-javascript构建失败,强制使用已知兼容的版本。在Dockerfile中添加命令修改项目的stack.yaml:
RUN sed -i '/extra-deps:/a \ - language-javascript-0.7.2.0' my-project/stack.yaml
也可以手动编辑stack.yaml的extra-deps字段添加该版本。
内容的提问来源于stack exchange,提问作者OrenIshShalom
相关产品推荐
相关产品推荐

