在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错误:打开的文件太多