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

时间:2017-03-23 05:35:55

标签: haskell docker haskell-stack

我有一个简单的Dockerfile

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

我将pwd文件夹挂载到" / root"。在我当前的文件夹中,我有一个使用堆栈(funblog)的Haskell项目。我在stack.yml中配置使用" lts-7.20"解析器,旨在安装ghc-8.0.1。

在容器内部,运行"堆栈更新"后,我运行"堆栈设置"但是我得到了#34;系统中打开的文件太多了#34;在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中是否存在构建GHC的问题。

更新2

对于任何希望重现的人(顺便说一下,在MAC OSX上),你可以克隆回购https://github.com/carlosayam/funblog并抓住这个提交9446bc0e52574cc574a9eb5f2733f69e07b874ef

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

1 个答案:

答案 0 :(得分:0)

默认情况下,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

要查看已打开的文件数量,请运行:sysctl kern.num_files

要检查当前限制是什么,请运行:sysctl kern.maxfiles

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

来源:Containers become unresponsive due to "too many connections"

另请参阅:Docker: How to increase number of open files limit

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

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

来源:Docker error: too many open files