As I know if we need adjust "open files" nofile
(soft and hard) in linux system, we need run command ulimit
or set in related configuraiton file to get the setting permanently. But I am little bit confused about the setting for containers running in a host
For example, If a Linux OS has ulimit
nofile set to 1024 (soft) and Hard (4096) , and I run docker with --ulimit nofile=10240:40960
, could the container use more nofiles than its host?
In my environment, current setting with dockers running,
I found the application can run with about 100K open files, then crash. How to understand this?
What's the real limits?
For example, If a Linux OS has
ulimit
nofile set to 1024 (soft) and Hard (4096) , and I run docker with----ulimit nofile=10240:40960
, could the container use more nofiles than its host?
CAP_SYS_RESOURCE
capability set on it's permissions.
This means that Docker is able to set an ulimit
different from the host. according to man 2 prlimit
:A privileged process (under Linux: one with the CAP_SYS_RESOURCE capability in the initial user namespace) may make arbitrary changes to either limit value.
$ cat /proc/$(ps -A | grep dockerd | awk '{print $1}')/limits | grep "files"
Max open files 1048576 1048576 files
As you can see, the docker 19 has a pretty high limit of 1048576
so your 40960 will work like a charm.
And if you run a docker container with --ulimit
set to be higher than the node but lower than the daemon itself, you won't find any problem, and won't need to give additional permissions like in the example below:
$ cat /proc/$(ps -A | grep dockerd | awk '{print $1}')/limits | grep "files"
Max open files 1048576 1048576 files
$ docker run -d -it --rm --ulimit nofile=99999:99999 python python;
354de39a75533c7c6e31a1773a85a76e393ba328bfb623069d57c38b42937d03
$ cat /proc/$(ps -A | grep python | awk '{print $1}')/limits | grep "files"
Max open files 99999 99999 files
/etc/init.d/docker
:$ cat /etc/init.d/docker | grep ulimit
ulimit -n 1048576
ulimit
higher than the docker daemon, it's a bit more tricky, but doable, refer here.securityContext.priviledged: true
, this way you can run the command ulimit
as root inside the container, here an example:image: image-name
command: ["sh", "-c", "ulimit -n 65536"]
securityContext:
privileged: true