Stack无法定位Haskell可执行文件以复制到Docker容器的问题
看起来你的核心问题是Stack的构建流程没有将编译好的可执行文件放到它预期的目录下,导致stack image container和stack build --copy-bins找不到目标文件。让我一步步帮你解决:
问题根源
Stack的stack build命令默认采用开发构建模式,它只会把编译好的可执行文件存放在项目的dist临时目录(也就是你通过find找到的.stack-work/dist/...路径),不会将文件复制到Stack的标准install目录(.stack-work/install/.../bin)。而stack image container和--copy-bins参数都是从这个标准install目录读取可执行文件的,所以才会出现找不到的错误。
解决步骤
清理旧构建缓存
先清理之前的构建残留,避免缓存干扰:stack clean安装可执行文件到标准目录
使用stack install命令替代stack build,这个命令会完成编译,并自动将可执行文件复制到Stack的install目录下:stack install执行完成后,你可以去
.stack-work/install/x86_64-linux-.../lts-11.9/8.2.2/bin/目录下查看,haskell-gae可执行文件应该已经存在了。生成Docker镜像
现在再执行stack image container命令,Stack就能正确找到可执行文件,并将其打包到Docker镜像中了:stack image container
额外验证
如果你想快速验证可执行文件是否在正确位置,也可以执行:
stack build --copy-bins
(注意是--copy-bins,不是你之前写的--copy bins,参数名是连在一起的)
这个命令现在应该能成功将可执行文件复制到默认的本地bin目录。
你的cabal文件和stack.yaml配置都是正确的,尤其是docker部分已经指定了entrypoints: - haskell-gae,只要可执行文件在正确路径,镜像就能正常生成。
内容的提问来源于stack exchange,提问作者Rob Cohen

