52

我需要在使用 ssh 连接到容器的 docker 容器上正确设置文件描述符限制(https://github.com/phusion/baseimage-docker

已经尝试过:

  • 编辑 limits.conf 容器忽略此文件
  • 新贵程序在https://coderwall.com/p/myodcq找到,但这个 docker 映像有不同类型的初始化进程。(运行)
  • 我试图在 /etc/pam.d 中修改 pam 库的配置
  • 尝试在 sshd_config 中为 ssh 启用 pam

输出总是一样的。

bash: ulimit: open files: cannot modify limit: Operation not permitted
4

8 回答 8

56

最新的 docker 支持通过命令行和 API 设置 ulimits。例如,docker run需要--ulimit <type>=<soft>:<hard>,并且可以有尽可能多的这些,只要你喜欢。所以,对于你的 nofile,一个例子是--ulimit nofile=262144:262144

于 2015-07-17T11:06:20.080 回答
31

经过一番搜索,我在 Google 群组讨论中找到了这个:

docker 目前禁止此功能以增强安全性。

那是因为主机系统的 ulimit 设置适用于 docker 容器。在容器中运行的程序可能会更改主机的ulimit设置,这被认为是一种安全风险。

好消息是您有两种不同的解决方案可供选择。

  1. sys_resourcelxc_template.godocker 中删除并重新编译。然后,您将能够将 ulimit 设置为您喜欢的最高值。

或者

  1. 停止码头恶魔。更改主机上的 ulimit 设置。启动 docker 恶魔。它现在具有您修改后的限制,以及它的子进程。

我应用了第二种方法:

  1. sudo service docker stop;

  2. 更改了/etc/security/limits.conf中的限制

  3. 重启机器

  4. 运行我的容器

  5. 在容器中运行ulimit -a以确认已继承打开文件限制。

请参阅:https ://groups.google.com/forum/#!searchin/docker-user/limits/docker-user/T45Kc9vD804/v8J_N4gLbacJ

于 2014-06-20T16:19:39.527 回答
11

如果使用 docker-compose 文件,基于 docker compose 版本 2.x 我们可以如下设置,覆盖默认配置。

ulimits:
  nproc: 65535
  nofile:
    soft: 26677
    hard: 46677

https://docs.docker.com/compose/compose-file/compose-file-v3/

于 2019-09-25T07:14:57.840 回答
10

我尝试了许多选项,但不确定为什么上面建议的一些解决方案在一台机器上工作而不在其他机器上工作。

一个可行且简单且可以在每个容器中运行的解决方案是:

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
于 2015-11-14T22:08:38.837 回答
5

实际上,我已经尝试了上述答案,但似乎没有用。

为了让我的容器确认ulimit更改,我必须docker.conf在启动它们之前更新文件:

$ sudo service docker stop
$ sudo bash -c "echo \"limit nofile 262144 262144\" >> /etc/init/docker.conf"
$ sudo service docker start
于 2014-10-14T16:06:40.563 回答
4

这就是我所做的。

ulimit -n 32000 在文件 /etc/init.d/docker 中设置

并重新启动 docker 服务

docker run -ti node:latest /bin/bash

运行此命令以验证

user@4d04d06d5022:/# ulimit -a

应该在结果中看到这个

open files (-n) 32000

[user@ip ec2-user]# docker run -ti node /bin/bash
user@4d04d06d5022:/# 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
于 2015-02-20T20:29:34.690 回答
3

docker run命令有一个--ulimit标志,您可以使用此标志来设置 docker 容器中的打开文件限制。

在启动容器时运行以下命令以设置打开文件限制。

docker run --ulimit nofile=<softlimit>:<hardlimit>冒号前的第一个值表示软文件限制,冒号后面的值表示硬文件限制。您可以通过在交互模式下运行容器并在容器外壳中执行以下命令来验证这一点ulimit -n

PS:查看这篇文以获得更清晰的信息

于 2017-12-19T05:46:44.207 回答
1

对于 boot2docker,我们可以将其设置为 on /var/lib/boot2docker/profile,例如:

ulimit -n 2018

请注意不要将此限制设置得太高,因为它会减慢 apt-get!请参阅错误#1332440。我有它与debian jessie。

于 2015-03-06T06:02:29.280 回答