Как установить ulimit/файловый дескриптор на контейнере докера, тег изображения - phusion/baseimage-docker
Мне нужно установить лимит дескриптора файла правильно в контейнере докера
Я подключаюсь к контейнеру с помощью ssh (https://github.com/phusion/baseimage-docker)
Уже пробовал:
- edit limits.conf, контейнер игнорирует этот файл
- процедура выскочки, найденная в https://coderwall.com/p/myodcq, но это изображение докеры имеет другой процесс инициализации. (Runit)
- Я попытался изменить конфигурацию библиотеки pam в файле /etc/pam.d
- попробуйте включить pam для ssh в sshd_config
Выход всегда одинаковый.
bash: ulimit: open files: cannot modify limit: Operation not permitted
Ответы
Ответ 1
Последний докер поддерживает установку ulimits через командную строку и API. Например, docker run
принимает --ulimit <type>=<soft>:<hard>
, и может быть столько, сколько вам нравится. Итак, для вашего nofile примером будет --ulimit nofile=262144:262144
Ответ 2
После некоторых поисков я нашел это в обсуждении групп Google:
docker в настоящее время запрещает эту возможность для повышения безопасности.
Это потому, что настройки ulimit для основной системы применяются к контейнеру докера. Это считается угрозой безопасности, что программы, запущенные в контейнере, могут изменять настройки ulimit для хоста.
Хорошей новостью является то, что у вас есть два разных решения.
- Удалите
sys_resource
из lxc_template.go
и перекомпилируйте докеры. затем
вы сможете установить ulimit как можно выше.
или
- Остановите демон докеров. Измените настройки ulimit на хосте. Начало
демон докеров. Теперь у вас есть свои пересмотренные лимиты, а его ребенок
процессов.
Я применил второй метод:
-
sudo service docker stop;
-
изменил пределы в /etc/security/limits.conf
-
перезагрузите компьютер.
-
запустите мой контейнер
-
запустите ulimit -a
в контейнере, чтобы подтвердить, что предел открытых файлов был унаследован.
Смотрите: https://groups.google.com/forum/#!searchin/docker-user/limits/docker-user/T45Kc9vD804/v8J_N4gLbacJ
Ответ 3
Я перепробовал множество вариантов и не уверен, почему несколько предложенных выше решений работают на одной машине, а не на других.
Решение, которое работает и является простым и может работать для каждого контейнера:
docker run --ulimit memlock=819200000:819200000 -h <docker_host_name> --name=current -v /home/user_home:/user_home -i -d -t docker_user_name/image_name
Ответ 4
На самом деле, я попробовал вышеуказанный ответ, но, похоже, он не работает.
Чтобы мои контейнеры могли подтвердить изменение ulimit
, мне пришлось обновить файл docker.conf
перед их запуском:
$ sudo service docker stop
$ sudo bash -c "echo \"limit nofile 262144 262144\" >> /etc/init/docker.conf"
$ sudo service docker start
Ответ 5
Вот что я сделал.
набор
ulimit -n 32000
в файле /etc/init.d/docker
и перезапустите службу докеров
docker run -ti node:latest /bin/bash
запустите эту команду, чтобы проверить
[email protected]:/# ulimit -a
должен видеть это в результате
open files (-n) 32000
[[email protected] ec2-user]# docker run -ti node /bin/bash
[email protected]:/# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 58729
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 32000
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 58729
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
Ответ 6
Команда docker run
имеет флаг --ulimit
, вы можете использовать этот флаг, чтобы установить ограничение на открытие файла в контейнере докера.
Запустите следующую команду, когда вы вращаете свой контейнер, чтобы установить ограничение на открытый файл.
docker run --ulimit nofile=<softlimit>:<hardlimit>
первое значение перед двоеточием указывает ограничение на мягкий файл и значение после того, как двоеточие указывает ограничение жесткого файла. вы можете проверить это, запустив контейнер в интерактивном режиме и выполнив следующую команду в вашей оболочке контейнеров ulimit -n
PS: ознакомьтесь с этим blog для большей ясности
Ответ 7
При использовании файла docker-compose,
На основе докера составьте версию 2.x
Мы можем установить, как показано ниже, переопределив конфигурацию по умолчанию.
ulimits:
nproc: 65535
nofile:
soft: 26677
hard: 46677
https://docs.docker.com/compose/compose-file/
Ответ 8
Для boot2docker мы можем установить его на /var/lib/boot2docker/profile
, например:
ulimit -n 2018
Будьте осторожны, чтобы не устанавливать этот предел слишком высоко, поскольку он замедлит apt-get! См. Сообщение об ошибке # 1332440. У меня было это с debian jessie.