在Docker容器中使用堆栈失败的Haskell安装:打开的文件太多

我有一个简单的Dockerfile

FROM haskell:8 WORKDIR "/root" CMD ["/bin/bash"] 

我运行安装pwd文件夹到“/ root”。 在我目前的文件夹中,我有一个使用堆栈(funblog)的Haskell项目。 我在stack.yml中configuration了使用“lts-7.20”parsing器,其目的是安装ghc-8.0.1。

在容器内部,运行“堆栈更新”后,我运行了“堆栈设置”,但在GHC编译过程中出现“系统中打开的文件太多”。

这是我的stack.yaml

 flags: {} packages: - '.' - location: git: https://github.com/agrafix/Spock.git commit: 2c60a48b2c0be0768071cc1b3c7f14590ffcc7d6 subdirs: - Spock - Spock-core - reroute - location: git: https://github.com/agrafix/Spock-digestive.git commit: 4c85647427e21bbaefbf04c4bc315d4bdfabba0e extra-deps: - digestive-bootstrap-0.1.0.1 - blaze-bootstrap-0.1.0.1 - digestive-functors-blaze-0.6.0.6 resolver: lts-7.20 

一个导入说明:我不想使用Docker来部署应用程序,只是为了编译它,即作为我的开发过程的一部分。

有任何想法吗?

我应该使用另一个图像没有ghc预安装使用docker? 哪一个?

更新

是的,我可以使用容器中的内置GHC,这是一个好主意,但是想知道在Docker中构buildGHC是否有问题。

更新2

对于任何想重现(在MAC OSX的方式),你可以克隆repo https://github.com/carlosayam/funblog并抓住这个提交9446bc0e52574cc574a9eb5f2733f69e07b874ef

(我可能会继续使用容器的GHC)

默认情况下,Docker for macOS限制文件描述符的数量,以避免触及macOS系统范围的限制(默认限制为900)。 要增加限制,请按照以下命令:

 $ cd ~/Library/Containers/com.docker.docker/Data/database/ $ git reset --hard HEAD is now at 9410b78 last-start-time changed at 1480947038 $ cat com.docker.driver.amd64-linux/slirp/max-connections 900 $ echo 1200 > com.docker.driver.amd64-linux/slirp/max-connections $ git add com.docker.driver.amd64-linux/slirp/max-connections $ git commit -s -m 'Update the maximum number of connections' [master 227a248] Update the maximum number of connections 1 file changed, 1 insertion(+), 1 deletion(-) 

然后通过以下方式检查通知消息

 $ syslog -k Sender Docker <Notice>: updating connection limit to 1200 

要检查打开了多less文件,请运行: sysctl kern.num_files

要检查你目前的限制,运行: sysctl kern.maxfiles

要增加系统范围,请运行: sysctl -w kern.maxfiles=20480

来源: 由于“连接太多”,容器变得无法响应 。

另请参阅: Docker:如何增加打开的文件数限制 。


在Linux上,你也可以尝试使用--ulimit运行Docker,例如

 docker run --ulimit nofile=5000:5000 <image-tag> 

来源: Docker错误:打开的文件太多