# Montajes tmpfs


Los [volúmenes](/engine/storage/tmpfs/volumes/) y los [montajes de tipo bind](/engine/storage/tmpfs/bind-mounts/) 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](https://en.wikipedia.org/wiki/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](https://github.com/docker/for-linux/issues/138). En algunos casos, [configurar el uid/gid](https://github.com/docker/compose/issues/3425#issuecomment-423091370) puede servir como una solución alternativa.

## Sintaxis

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

```console
$ 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 (`:`).

```console
$ 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ón | Descripción |
| ------------ | ------------------------------------------------------------------------------------------- |
| `ro`         | Crea un montaje tmpfs de solo lectura. |
| `rw`         | Crea un montaje tmpfs de lectura y escritura (comportamiento predeterminado). |
| `nosuid`     | Evita que se respeten los bits `setuid` y `setgid` durante la ejecución. |
| `suid`       | Permite que se respeten los bits `setuid` y `setgid` durante la ejecución (comportamiento predeterminado). |
| `nodev`      | Los archivos de dispositivo se pueden crear pero no son funcionales (el acceso produce un error). |
| `dev`        | Los archivos de dispositivo se pueden crear y son completamente funcionales. |
| `exec`       | Permite la ejecución de binarios ejecutables en el sistema de archivos montado. |
| `noexec`     | No permite la ejecución de binarios ejecutables en el sistema de archivos montado. |
| `sync`       | Toda la E/S en el sistema de archivos se realiza de forma síncrona. |
| `async`      | Toda la E/S en el sistema de archivos se realiza de forma asíncrona (comportamiento predeterminado). |
| `dirsync`    | Las actualizaciones de directorios dentro del sistema de archivos se realizan de forma síncrona. |
| `atime`      | Actualiza la hora de acceso al archivo cada vez que se accede a él. |
| `noatime`    | No actualiza las horas de acceso al archivo cuando se accede a él. |
| `diratime`   | Actualiza las horas de acceso a directorios cada vez que se accede al directorio. |
| `nodiratime` | No actualiza las horas de acceso a directorios cuando se accede al directorio. |
| `size`       | Especifica el tamaño del montaje tmpfs, por ejemplo, `size=64m`. |
| `mode`       | Especifica el modo de archivo (permisos) para el montaje tmpfs (por ejemplo, `mode=1777`). |
| `uid`        | Especifica el ID de usuario para el propietario del montaje tmpfs (por ejemplo, `uid=1000`). |
| `gid`        | Especifica el ID de grupo para el propietario del montaje tmpfs (por ejemplo, `gid=1000`). |
| `nr_inodes`  | Especifica el número máximo de inodos para el montaje tmpfs (por ejemplo, `nr_inodes=400k`). |
| `nr_blocks`  | Especifica el número máximo de bloques para el montaje tmpfs (por ejemplo, `nr_blocks=1024`). |

```console {title="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.

```console
$ 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.

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

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

| Opción | Descripción |
| :----------------------------- | :--------------------------------------------------------------------------------------------------------------------- |
| `destination`, `dst`, `target` | Ruta del contenedor para montar en un tmpfs. |
| `tmpfs-size`                   | Tamañ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-mode`                   | Modo de archivo del tmpfs en octal. Por ejemplo, `700` o `0770`. El valor predeterminado es `1777` (escritura abierta para todos). |

```console {title="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`.

**`--mount`**



```console
$ 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`:

```console
$ docker inspect tmptest --format '{{ json .Mounts }}'
[{"Type":"tmpfs","Source":"","Destination":"/app","Mode":"","RW":true,"Propagation":""}]
```

**`--tmpfs`**



```console
$ 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`:

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



Detén y elimina el contenedor:

```console
$ docker stop tmptest
$ docker rm tmptest
```

## Siguientes pasos

- Aprende sobre los [volúmenes](/engine/storage/tmpfs/volumes/)
- Aprende sobre los [montajes de tipo bind](/engine/storage/tmpfs/bind-mounts/)
- Aprende sobre los [controladores de almacenamiento](/engine/storage/drivers/)

