Compartir comentarios
Las respuestas se generan en base a la documentación.

Montajes tmpfs

Los volúmenes y los montajes de tipo bind te permiten compartir archivos entre la máquina anfitriona y el contenedor para que puedas persistir los datos incluso después de detener el contenedor.

Si ejecutas Docker en Linux, tienes una tercera opción: los montajes tmpfs. Cuando creas un contenedor con un montaje tmpfs, el contenedor puede crear archivos fuera de la capa de escritura del contenedor.

A diferencia de los volúmenes y los montajes de tipo bind, un montaje tmpfs es temporal y solo se persiste en la memoria del anfitrión. Cuando el contenedor se detiene, el montaje tmpfs se elimina y los archivos escritos en él no se persistirán.

Los montajes tmpfs se utilizan mejor en los casos en que no quieres que los datos persistan en la máquina anfitriona ni dentro del contenedor. Esto puede ser por motivos de seguridad o para proteger el rendimiento del contenedor cuando tu aplicación necesita escribir un gran volumen de datos de estado no persistentes.

Important

Los montajes tmpfs en Docker se mapean directamente a tmpfs en el kernel de Linux. Como tal, los datos temporales pueden escribirse en un archivo de intercambio (swap) y, por lo tanto, persistir en el sistema de archivos.

Montajes sobre datos existentes

Si creas un montaje tmpfs en un directorio del contenedor en el que ya existen archivos o directorios, los archivos preexistentes quedarán ocultos por el montaje. Esto es similar a si guardaras archivos en /mnt en un anfitrión Linux y luego montaras una unidad USB en /mnt. El contenido de /mnt quedaría oculto por el contenido de la unidad USB hasta que esta se desmontara.

En el caso de los contenedores, no existe una forma sencilla de eliminar un montaje para volver a mostrar los archivos ocultos. Tu mejor opción es volver a crear el contenedor sin el montaje.

Limitaciones de los montajes tmpfs

  • A diferencia de los volúmenes y los montajes de tipo bind, no puedes compartir montajes tmpfs entre contenedores.
  • Esta funcionalidad solo está disponible si ejecutas Docker en Linux.
  • Configurar permisos en tmpfs puede hacer que estos se restablezcan después de reiniciar el contenedor. En algunos casos, configurar el uid/gid puede servir como una solución alternativa.

Sintaxis

Para montar un tmpfs con el comando docker run, puedes utilizar la bandera --mount o --tmpfs.

$ docker run --mount type=tmpfs,dst=<mount-path>
$ docker run --tmpfs <mount-path>

En general, se prefiere --mount. La principal diferencia es que la bandera --mount es más explícita. Por otro lado, --tmpfs es menos detallada y proporciona más flexibilidad, ya que te permite configurar más opciones de montaje.

La bandera --tmpfs no se puede utilizar con servicios de swarm. Debes utilizar --mount.

Opciones para --tmpfs

La bandera --tmpfs consta de dos campos, separados por un carácter de dos puntos (:).

$ docker run --tmpfs <mount-path>[:opts]

El primer campo es la ruta del contenedor para montar en un tmpfs. El segundo campo es opcional y te permite configurar opciones de montaje. Las opciones válidas de montaje para --tmpfs incluyen:

OpciónDescripción
roCrea un montaje tmpfs de solo lectura.
rwCrea un montaje tmpfs de lectura y escritura (comportamiento predeterminado).
nosuidEvita que se respeten los bits setuid y setgid durante la ejecución.
suidPermite que se respeten los bits setuid y setgid durante la ejecución (comportamiento predeterminado).
nodevLos archivos de dispositivo se pueden crear pero no son funcionales (el acceso produce un error).
devLos archivos de dispositivo se pueden crear y son completamente funcionales.
execPermite la ejecución de binarios ejecutables en el sistema de archivos montado.
noexecNo permite la ejecución de binarios ejecutables en el sistema de archivos montado.
syncToda la E/S en el sistema de archivos se realiza de forma síncrona.
asyncToda la E/S en el sistema de archivos se realiza de forma asíncrona (comportamiento predeterminado).
dirsyncLas actualizaciones de directorios dentro del sistema de archivos se realizan de forma síncrona.
atimeActualiza la hora de acceso al archivo cada vez que se accede a él.
noatimeNo actualiza las horas de acceso al archivo cuando se accede a él.
diratimeActualiza las horas de acceso a directorios cada vez que se accede al directorio.
nodiratimeNo actualiza las horas de acceso a directorios cuando se accede al directorio.
sizeEspecifica el tamaño del montaje tmpfs, por ejemplo, size=64m.
modeEspecifica el modo de archivo (permisos) para el montaje tmpfs (por ejemplo, mode=1777).
uidEspecifica el ID de usuario para el propietario del montaje tmpfs (por ejemplo, uid=1000).
gidEspecifica el ID de grupo para el propietario del montaje tmpfs (por ejemplo, gid=1000).
nr_inodesEspecifica el número máximo de inodos para el montaje tmpfs (por ejemplo, nr_inodes=400k).
nr_blocksEspecifica el número máximo de bloques para el montaje tmpfs (por ejemplo, nr_blocks=1024).
Example
$ docker run --tmpfs /data:noexec,size=1024,mode=1777

No todas las características de montaje tmpfs disponibles en el comando mount de Linux son compatibles con la bandera --tmpfs. Si necesitas opciones o características avanzadas de tmpfs, es posible que debas utilizar un contenedor privilegiado o configurar el montaje fuera de Docker.

Caution

Ejecutar contenedores con --privileged otorga permisos elevados y puede exponer el sistema anfitrión a riesgos de seguridad. Utiliza esta opción únicamente cuando sea absolutamente necesario y en entornos de confianza.

$ docker run --privileged -it debian sh
/# mount -t tmpfs -o <options> tmpfs /data

Opciones para --mount

La bandera --mount consta de múltiples pares clave-valor, separados por comas, cada uno de los cuales consiste en una tupla <key>=<value>. El orden de las claves no es relevante.

$ docker run --mount type=tmpfs,dst=<mount-path>[,<key>=<value>...]

Las opciones válidas para --mount type=tmpfs incluyen:

OpciónDescripción
destination, dst, targetRuta del contenedor para montar en un tmpfs.
tmpfs-sizeTamaño del montaje tmpfs en bytes. Si no se establece, el tamaño máximo predeterminado de un volumen tmpfs es el 50% de la memoria RAM total del anfitrión.
tmpfs-modeModo de archivo del tmpfs en octal. Por ejemplo, 700 o 0770. El valor predeterminado es 1777 (escritura abierta para todos).
Example
$ docker run --mount type=tmpfs,dst=/app,tmpfs-size=21474836480,tmpfs-mode=1770

Usar un montaje tmpfs en un contenedor

Para utilizar un montaje tmpfs en un contenedor, usa la bandera --tmpfs o utiliza la bandera --mount con las opciones type=tmpfs y destination. No existe un origen (source) para los montajes tmpfs. El siguiente ejemplo crea un montaje tmpfs en /app en un contenedor de Nginx. El primer ejemplo utiliza la bandera --mount y el segundo utiliza la bandera --tmpfs.

$ docker run -d \
  -it \
  --name tmptest \
  --mount type=tmpfs,destination=/app \
  nginx:latest

Verifica que el montaje sea de tipo tmpfs buscando en la sección Mounts de la salida de docker inspect:

$ docker inspect tmptest --format '{{ json .Mounts }}'
[{"Type":"tmpfs","Source":"","Destination":"/app","Mode":"","RW":true,"Propagation":""}]
$ docker run -d \
  -it \
  --name tmptest \
  --tmpfs /app \
  nginx:latest

Verifica que el montaje sea de tipo tmpfs buscando en la sección Mounts de la salida de docker inspect:

$ docker inspect tmptest --format '{{ json .Mounts }}'
{"/app":""}

Detén y elimina el contenedor:

$ docker stop tmptest
$ docker rm tmptest

Siguientes pasos