Я запускаю веб-сервер, который обрабатывает многие тысячи одновременных подключений к веб-сокетам. Чтобы это было возможно, в Debian linux (мой базовый образ — google/debian:wheezy, работающий на GCE), где количество открытых файлов по умолчанию равно 1000, я обычно просто устанавливаю ulimit на нужное число (64 000) .
Это отлично работает, за исключением того, что когда я докеризировал свое приложение и развернул его, я обнаружил, что докер игнорирует определения ограничений. Я пробовал следующее (все на хост-компьютере, а не в самом контейнере):
MAX=64000
sudo bash -c "echo \"* soft nofile $MAX\" >> /etc/security/limits.conf"
sudo bash -c "echo \"* hard nofile $MAX\" >> /etc/security/limits.conf"
sudo bash -c "echo \"ulimit -c $MAX\" >> /etc/profile"
ulimit -c $MAX
Проведя некоторое исследование, я обнаружил, что люди смогли решить аналогичную проблему, выполнив следующее:
sudo bash -c "echo \"limit nofile 262144 262144\" >> /etc/init/docker.conf"
и перезагрузка/перезапуск службы докеров.
Однако все вышеперечисленное терпит неудачу: я получаю сообщение об ошибке «слишком много открытых файлов», когда мое приложение запускается внутри контейнера (выполнение следующих действий без докера решает проблему).
Я попытался запустить ulimit -a
внутри контейнера, чтобы узнать, работает ли установка ulimit, но при этом возникает ошибка о том, что ulimit не является исполняемым файлом, который является частью PATH.
Кто-нибудь сталкивался с этим и / или может предложить способ заставить докер распознавать ограничения?