Al fin después de mucho batallar pudimos hallar la contestación de este contratiempo que ciertos de nuestros lectores de este sitio web han presentado. Si deseas compartir alguna información no dudes en compartir tu comentario.
Aunque es un poco tarde, solo quiero despejar las dudas sobre la diferencia en ulimit.
Si establece el valor neto al ejecutar el contenedor, el valor ulimit que se muestra dentro del contenedor proviene del sistema operativo host. La pregunta es, entonces, ¿por qué ve un valor diferente cuando ejecuta el mismo comando desde el host?
Esto se debe a que, al ejecutar el comando en el host, muestra su límite suave. Por otro lado, el valor que muestra el contenedor es el límite estricto del sistema operativo host. La razón de esto es que se le permite cruzar el límite suave. Entonces, en cierto sentido, el límite estricto es en realidad el límite real. Puede encontrar más información sobre ulimit en este enlace.
Para ver el límite duro simplemente escriba el siguiente comando
ulimit -Hn
Verás que los valores coinciden.
nótese bien No puede cruzar el límite duro, pero puede aumentarlo si es la raíz.
Los límites en los archivos abiertos se pueden establecer en la configuración de Docker usando LimitNOFILE
o se pueden pasar al docker run
mando:
$ docker run -it --ulimit nofile=1024:2048 ubuntu bash -c 'ulimit -Hn && ulimit -Sn'
2048
1024
Consulte aquí para obtener más información sobre la configuración de ulimits en Docker.
Tenga en cuenta que este límite se puede establecer más alto que el límite estricto del sistema operativo, lo que puede causar problemas.
El límite real será 1048576.
Eche un vistazo a la parte derecha de esta imagen, que muestra que los contenedores son básicamente procesos aislados que se ejecutan en el mismo sistema operativo:
Como cada llamada al sistema en el contenedor será manejada directamente por el sistema operativo host, el ulimit que se muestra (1048576) proviene directamente del sistema operativo host y ese es el valor que se utilizará.
La diferencia en los ulimits podría deberse a una configuración de Docker, por ejemplo.
(Tenga en cuenta que para máquinas virtualesesto será diferente: el sistema operativo invitado puede mostrar un valor de 1048576, pero las llamadas abiertas al final serán manejadas por el sistema operativo anfitrión, que impondrá el límite de 1024)