Serie N8N (VIII): Ejecutar workflows en Docker y resolver problemas de acceso a archivos
- 7 mar
- 12 Min. de lectura
La automatización solo es realmente útil cuando los workflows funcionan de forma estable en entornos reales.
En capítulos anteriores hemos aprendido a:
crear workflows en N8N,
trabajar con APIs,
procesar datos,
y ejecutar N8N dentro de Docker.
Todo parecía funcionar perfectamente… hasta que intentamos ejecutar uno de nuestros workflows anteriores dentro del contenedor.
En concreto, el workflow que creamos en uno de los primeros artículos de la serie: Serie N8N (III): Tu primer workflow real – Obtener una frase del día y guardarla en un archivo. Ese workflow obtenía una frase desde una API y la guardaba como archivo JSON en nuestro ordenador.

En la instalación local funcionaba sin problemas. Pero al ejecutarlo dentro de Docker aparecieron errores de acceso y escritura de archivos. Este tipo de problemas es muy habitual cuando se empieza a usar Docker, y entender por qué ocurre es fundamental para poder ejecutar automatizaciones reales.
En este capítulo vamos a resolverlo paso a paso.
Veremos:
por qué los workflows que escriben archivos fallan dentro de Docker
cómo funciona el sistema de archivos en un contenedor
cómo crear volúmenes adicionales para almacenar datos
y cómo adaptar nuestros workflows para que funcionen correctamente
Para ello utilizaremos el workflow del artículo anterior, que podrás descargar del artículo original o al final de este artículo. LK_n8n_wf_API_FraseDelDia_Docker.json
Al terminar este capítulo tendrás una instalación de N8N en Docker capaz de ejecutar workflows que leen y escriben archivos sin problemas de permisos o rutas.
2. El problema al ejecutar workflows que escriben archivos
El workflow que creamos en uno de los primeros artículos de la serie hacía algo muy sencillo pero muy útil:
1️⃣ obtenía una frase aleatoria desde una API
2️⃣ convertía la respuesta en un archivo JSON
3️⃣ guardaba ese archivo en el disco

Este workflow funciona perfectamente cuando ejecutamos N8N instalado directamente en nuestro ordenador, porque el nodo final puede acceder sin problemas a las carpetas del sistema.
En nuestro caso utilizábamos una ruta como esta:
C:\Users\josek\Downloads\frase_XXXX.jsonEsto significa que el archivo generado se guardaba directamente en la carpeta Downloads del usuario.
Cuando ejecutamos el workflow en Docker
Cuando intentamos ejecutar exactamente el mismo workflow en N8N dentro de Docker, aparece un problema.
El nodo Read/Write Files from Disk intenta escribir en la ruta que definimos anteriormente, pero el contenedor no puede encontrar esa carpeta.
El resultado suele ser un error parecido a este:
ENOENT: no such file or directoryo errores de permisos como:
permission denied¿Por qué ocurre esto?
La razón es sencilla pero importante: 👉 Docker ejecuta N8N dentro de un entorno aislado.
Ese contenedor tiene su propio sistema de archivos, completamente separado del sistema operativo del ordenador.
Por eso, cuando el workflow intenta acceder a una ruta como:
C:\Users\josek\Downloadsesa carpeta simplemente no existe dentro del contenedor.
Desde el punto de vista de Docker, esa ruta pertenece al sistema host, no al contenedor. Y aquí es donde entran en juego los volúmenes de Docker, que nos permiten compartir carpetas entre el contenedor y nuestro ordenador.
3. Cómo funciona el sistema de archivos dentro de Docker
Para entender por qué falla nuestro workflow, primero hay que comprender una idea fundamental sobre Docker:
👉 los contenedores están aislados del sistema operativo del ordenador. Cuando ejecutamos N8N con Docker, en realidad estamos ejecutando la aplicación dentro de un mini sistema Linux independiente.
Eso significa que existen dos sistemas de archivos distintos.
1️⃣ El sistema de archivos de tu ordenador (host)
Este es el sistema que usas normalmente.
Por ejemplo:
C:\Users\josek\Downloadso en sistemas Linux/Mac:
/home/usuario/DownloadsAquí es donde están tus documentos, tus descargas y tus archivos personales.
2️⃣ El sistema de archivos del contenedor
Dentro del contenedor Docker existe un sistema completamente separado.
Por ejemplo:
/home/node/Ese es el entorno donde se ejecuta N8N. Desde dentro del contenedor no existen automáticamente las carpetas de tu ordenador.
Por eso una ruta como esta:
C:\Users\josek\Downloadsno tiene ningún significado dentro del contenedor.
Visualmente ocurre algo así
Tu ordenador (Host)
│
├── C:\Users\josek\Downloads
│
│
└── Docker
│
└── Contenedor N8N
│
└── /home/node/
El contenedor no puede ver las carpetas del host a menos que se lo indiquemos explícitamente.
Aquí es donde entran los volúmenes
Docker resuelve este problema con los volúmenes.
Un volumen permite conectar una carpeta del contenedor con un espacio de almacenamiento externo, de forma que los datos persistan y puedan ser compartidos.
En nuestro caso ya usamos uno:
n8n_dataEste volumen guarda:
usuarios
workflows
credenciales
configuración de N8N
Pero para workflows que generan archivos necesitamos algo más. 👉 un segundo volumen dedicado a archivos generados por los workflows.
4. Crear un volumen adicional para archivos
En el capítulo anterior ya creamos un volumen para guardar la configuración de N8N:
docker volume create n8n_dataEse volumen almacena información importante como:
usuarios
workflows
credenciales
configuraciones de N8N
Pero en nuestro caso el workflow que estamos utilizando hace algo más: 👉 genera archivos.
En concreto, guarda frases obtenidas desde una API en archivos JSON.
Para que N8N pueda escribir esos archivos correctamente cuando se ejecuta dentro de Docker, vamos a crear un segundo volumen dedicado a archivos generados por los workflows.
Crear el volumen n8n_files
En Docker desktop:

Usando una terminal
Abrimos una terminal y ejecutamos:
docker volume create n8n_filesEste comando crea un volumen Docker independiente llamado:
n8n_filesEste volumen se utilizará para almacenar archivos creados por los workflows.
Verificar que el volumen se ha creado
Podemos comprobar los volúmenes existentes ejecutando:
docker volume ls
Ahora tenemos dos volúmenes:
Volumen | Uso |
n8n_data | Configuración y datos internos de N8N |
n8n_files | Archivos generados por workflows |
Separar estos dos tipos de datos es una buena práctica porque:
facilita las copias de seguridad
permite gestionar archivos generados por automatizaciones
mantiene la instalación más ordenada
Qué haremos con este volumen
En el siguiente paso vamos a conectar este volumen al contenedor de N8N.
De esta forma el contenedor podrá acceder a una carpeta interna como:
/filesy todo lo que se guarde ahí se almacenará realmente en el volumen n8n_files.
Eso es lo que permitirá que nuestros workflows puedan guardar archivos sin errores de acceso o permisos.
5. Recrear el contenedor con dos volúmenes
Ahora que hemos creado el nuevo volumen n8n_files, el siguiente paso es recrear el contenedor de N8N para que pueda utilizarlo.
Hasta ahora nuestro contenedor usaba únicamente un volumen:
n8n_dataque se encargaba de guardar la configuración interna de N8N.
Ahora vamos a añadir un segundo volumen para archivos generados por workflows:
n8n_filesDe esta forma tendremos una instalación mucho más completa y preparada para automatizaciones reales.
Vamos a eliminar nuestro contenedor N8N y vamos a crearlo de nuevo, esta vez usando esta parametrización:
A. Creación container usando Docker Desktop
Primero habremos eliminado el container n8n que teníamos creado.
Ahora vamos a imágenes y vamos a crear un nuevo container

Ahora indicamos los parámetros para este nuevo container, al que volveremos a llamar n8n y conectaremos a los dos volúmenes de datos: "n8n_data" y "n8n_files" que hemos visto como crear en el apartado anterior.

Categoría | Parámetro | Valor | Descripción |
General | Image | Imagen oficial de n8n | |
General | Container name | n8n | Nombre del contenedor |
Network | Host Port | 5678 | Puerto del host |
Network | Container Port | 5678 | Puerto interno de n8n |
Volume | Volume name | n8n_data | Volumen para datos de n8n |
Volume | Container path | /home/node/.n8n | Carpeta de configuración y base de datos |
Volume | Volume name | n8n_files | Volumen para archivos generados por workflows |
Volume | Container path | /files | Carpeta accesible para guardar archivos |
Environment | GENERIC_TIMEZONE | Europe/Madrid | Zona horaria usada por n8n |
Environment | TZ | Europe/Madrid | Zona horaria del contenedor |
Environment | N8N_RESTRICT_FILE_ACCESS_TO | /files | Limita el acceso de nodos de archivo a esta ruta |
Environment | N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS | true | Fuerza permisos correctos en archivos de configuración |
Environment | N8N_RUNNERS_ENABLED | true | Activa runners de ejecución en n8n |
Una vez creado el container lo arrancamos

B. Creación container usando Terminal
Abrimos la terminal y ejecutamos el siguiente comando:
docker run -it --rm \
--name n8n \
-p 5678:5678 \
-e GENERIC_TIMEZONE="Europe/Madrid" \
-e TZ="Europe/Madrid" \
-e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true \
-e N8N_RUNNERS_ENABLED=true \
-e N8N_RESTRICT_FILE_ACCESS_TO=/files \
-v n8n_data:/home/node/.n8n \
-v n8n_files:/files \
docker.n8n.io/n8nio/n8nEste comando inicia el contenedor de N8N igual que en el capítulo anterior, pero ahora incluye dos volúmenes y una configuración adicional de seguridad.
Conexión a los dos volúmenes
Volumen | Carpeta dentro del contenedor | Uso |
n8n_data | /home/node/.n8n | Configuración y datos internos |
n8n_files | /files | Archivos generados por workflows |
Esto significa que cualquier archivo que N8N guarde en la carpeta:
/filesse almacenará realmente en el volumen n8n_files. y esa carpeta sí existe dentro del contenedor. Por tanto, cuando el workflow guarde un archivo en esa ruta, Docker no bloqueará el acceso y el nodo Read/Write Files from Disk funcionará correctamente.
La variable de seguridad que evita errores
También hemos añadido esta línea:
-e N8N_RESTRICT_FILE_ACCESS_TO=/filesEsta variable es muy importante cuando usamos nodos que acceden al sistema de archivos.
Lo que hace es restringir el acceso de N8N únicamente a la carpeta /files.
Esto tiene dos ventajas:
✔ mejora la seguridad del contenedor
✔ evita errores de acceso cuando usamos nodos como:
Read/Write Files from Disk
Read Binary File
Write Binary File
Si no configuramos esta variable, N8N puede bloquear el acceso al sistema de archivos incluso aunque el volumen esté correctamente montado.
6. Ajustar el workflow para Docker
Ahora que el contenedor de N8N tiene acceso a la carpeta /files, el siguiente paso es adaptar el workflow para que guarde los archivos en esa ubicación.
El workflow que estamos utilizando es el que creamos en uno de los primeros artículos de la serie: “Serie N8N (III): Tu primer workflow real – Obtener una frase del día y guardarla en un archivo”.
El workflow original
El flujo es muy sencillo:
1️⃣ el nodo HTTP Request obtiene una frase desde una API
2️⃣ Convert to File genera un archivo JSON
3️⃣ Read/Write Files from Disk guarda ese archivo en el disco
El problema con la ruta original
En el artículo original utilizábamos una ruta como esta:
C:\Users\josek\Downloads\frase_XXXX.jsonEsa ruta funcionaba cuando N8N estaba instalado directamente en el ordenador. Pero dentro de Docker esa ruta no existe, porque el contenedor tiene su propio sistema de archivos.
La solución: usar la carpeta /files
Ahora que hemos conectado el volumen n8n_files, podemos utilizar una ruta válida dentro del contenedor:
/filesTodo lo que se guarde ahí se almacenará realmente en el volumen Docker que hemos creado.
Modificar el nodo Read/Write Files from Disk
Abrimos el nodo final del workflow y cambiamos el campo File Name por algo como esto:
/files/frase_{{$now.format('yyyyLLdd_HHmm')}}.jsonEsto hará que cada vez que ejecutemos el workflow se genere un archivo con un nombre único basado en la fecha y hora.
Por ejemplo:
frase_20260306_2145.json
7. Ejecutar el workflow
Una vez actualizado el workflow para guardar los archivos en la carpeta /files, ya podemos ejecutarlo dentro de nuestra instalación de N8N en Docker.
Ahora simplemente pulsa: Execute Workflow. Si todo está correctamente configurado, verás los nodos en verde, indicando que el workflow se ha ejecutado con éxito.
El workflow hará lo siguiente:
1️⃣ solicitar una frase aleatoria a la API
2️⃣ convertir la respuesta en un archivo JSON
3️⃣ guardar el archivo en la carpeta /files
Cada ejecución generará un archivo nuevo con un nombre basado en la fecha y hora.
Ver el archivo generado dentro del Docker Desktop

Ver los archivos generados desde la terminal
También podemos comprobar que los archivos se han creado dentro del contenedor ejecutando el siguiente comando en otra terminal:
docker exec -it n8n shEste comando hace lo siguiente:
docker exec → ejecuta un comando dentro del contenedor
-it → abre una sesión interactiva
n8n → nombre del contenedor
sh → abre una shell dentro del contenedor
Ahora estamos dentro del contenedor Docker, y una vez dentro del contenedor podemos listar los archivos ejecutando:
ls /filesCuando hayas terminado puedes salir de la shell con:
exit
8. Comandos útiles para trabajar con el contenedor de N8N
Cuando trabajamos con N8N dentro de Docker es muy útil conocer algunos comandos básicos para inspeccionar el contenedor y verificar su configuración.
Estos comandos ayudan mucho cuando aparece algún problema con:
rutas de archivos
variables de entorno
permisos
o configuración del contenedor
Vamos a ver algunos de los más útiles.
Ver las variables de entorno del contenedor
Un comando muy útil para comprobar cómo se ha configurado N8N es:
docker exec -it n8n envEste comando muestra todas las variables de entorno activas dentro del contenedor. Esto nos permite confirmar que el contenedor se ha iniciado correctamente con los parámetros que definimos.

Entrar al contenedor
Si queremos explorar el contenedor manualmente podemos abrir una shell dentro de él:
docker exec -it n8n shEsto nos permite ejecutar comandos directamente dentro del contenedor. Por ejemplo:
ls /filespara ver los archivos generados por los workflows.
Para salir del contenedor:
exitVer los contenedores activos
Para ver qué contenedores Docker están en ejecución podemos usar:
docker ps
Esto confirma que el contenedor de N8N está funcionando.
Ver los volúmenes creados
También podemos listar los volúmenes disponibles:
docker volume lsVer información detallada de un volumen
Si queremos ver más información sobre un volumen concreto podemos usar:
docker volume inspect n8n_filesEsto mostrará la ruta interna donde Docker guarda ese volumen.

Crear una carpeta dentro del contenedor
A veces necesitamos organizar mejor los archivos generados por nuestros workflows. Por ejemplo, podemos querer guardar todos los archivos dentro de una carpeta específica. Para ello primero entramos en el contenedor:
docker exec -it n8n shUna vez dentro podemos crear una nueva carpeta dentro de /files. En este ejemplo vamos a crear una carpeta llamada LK:
mkdir /files/LKAhora podemos comprobar que la carpeta se ha creado correctamente ejecutando:
ls /filesGuardar archivos dentro de la carpeta LK
Si queremos que nuestros workflows guarden los archivos dentro de esta carpeta, simplemente tendremos que modificar la ruta en el nodo Read/Write Files from Disk.
Por ejemplo:
/files/LK/frase_{{$now.format('yyyyLLdd_HHmm')}}.jsonDe esta forma todos los archivos generados por el workflow se guardarán dentro de la carpeta LK.
9. Mapear el volumen n8n_files a una carpeta del ordenador
Hasta ahora los archivos generados por nuestros workflows se están guardando en el volumen Docker:
n8n_filesEsto funciona perfectamente, pero tiene un pequeño inconveniente: 👉 los archivos no se ven directamente desde el explorador de archivos del ordenador. Para acceder a ellos tenemos que entrar al contenedor o inspeccionar el volumen desde Docker.
Una solución muy práctica es mapear ese volumen a una carpeta real del ordenador. De esta forma podremos ver los archivos generados por N8N directamente desde el sistema operativo.
Crear una carpeta en el ordenador
Primero creamos una carpeta en nuestro ordenador. Por ejemplo:
C:\n8n_filesEsta carpeta será el lugar donde Docker guardará los archivos generados por N8N.
Modificar el comando de arranque de Docker
Ahora vamos a recrear el contenedor de N8N cambiando la forma en la que montamos el volumen.
En lugar de usar el volumen Docker n8n_files, vamos a conectar directamente una carpeta del ordenador.
El comando quedaría así:
docker run -it --rm \
--name n8n \
-p 5678:5678 \
-e GENERIC_TIMEZONE="Europe/Madrid" \
-e TZ="Europe/Madrid" \
-e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true \
-e N8N_RUNNERS_ENABLED=true \
-e N8N_RESTRICT_FILE_ACCESS_TO=/files \
-v n8n_data:/home/node/.n8n \
-v C:\n8n_files:/files \
docker.n8n.io/n8nio/n8nLa línea importante es esta:
-v C:\n8n_files:/filesEsto conecta:
Carpeta del ordenador | Carpeta del contenedor |
C:\n8n_files | /files |
A partir de este momento:
los workflows seguirán guardando archivos en /files
Docker guardará esos archivos en C:\n8n_files
podremos verlos directamente desde el explorador del sistema
Ventajas de este enfoque
Mapear una carpeta del host tiene varias ventajas:
permite acceder a los archivos sin entrar al contenedor
facilita trabajar con los archivos generados
simplifica integraciones con otras herramientas
es muy útil para workflows que generan informes o datos
10. Qué hemos aprendido realmente en este capítulo
En este capítulo hemos dado un paso importante en el uso real de N8N con Docker.
Hasta ahora habíamos conseguido ejecutar N8N dentro de un contenedor, pero al empezar a trabajar con workflows que generan archivos aparecieron algunos problemas típicos relacionados con el acceso al sistema de archivos.
A lo largo del artículo hemos visto cómo resolverlos paso a paso.
En concreto hemos aprendido a:
entender por qué un contenedor Docker no puede acceder directamente a las carpetas del ordenador
utilizar volúmenes Docker para almacenar datos persistentes
crear un volumen adicional (n8n_files) para archivos generados por workflows
recrear correctamente el contenedor de N8N con varios volúmenes
configurar la variable de seguridad N8N_RESTRICT_FILE_ACCESS_TO
adaptar los workflows para guardar archivos dentro de /files
comprobar los archivos generados desde la terminal
explorar el contenedor con comandos útiles de Docker
crear carpetas dentro del volumen para organizar los archivos
y mapear una carpeta real del ordenador para acceder directamente a los archivos generados
Con estos pasos hemos convertido una instalación básica de N8N en Docker en un entorno mucho más completo y preparado para automatizaciones reales.
A partir de ahora podrás ejecutar workflows que:
generan archivos
guardan resultados de APIs
crean informes
procesan datos descargados de internet
sin problemas de permisos ni de rutas.
Conclusión
Cuando empezamos a usar Docker es normal encontrarse con pequeños obstáculos relacionados con el acceso al sistema de archivos.
Pero una vez entendemos cómo funcionan los contenedores, los volúmenes y el mapeo de carpetas, Docker se convierte en una herramienta extremadamente potente para ejecutar automatizaciones de forma estable y reproducible.
En este capítulo hemos visto exactamente ese proceso: pasar de un workflow que funciona en local a un workflow que funciona correctamente dentro de Docker.
Ese pequeño salto es el que permite que nuestras automatizaciones puedan ejecutarse más adelante en un servidor o en un VPS, manteniendo exactamente la misma arquitectura.
Qué hacer ahora
Si ya tienes N8N funcionando en Docker, te recomiendo probar ahora algunas pequeñas variaciones sobre este ejemplo:
guardar los archivos en diferentes carpetas
cambiar el nombre del archivo generado
ejecutar el workflow varias veces para generar múltiples archivos
usar otras APIs en el nodo HTTP Request
Cuanto más experimentes con workflows que generan archivos, más natural te resultará trabajar con N8N en Docker.
🌐 Recursos
📘 Documentación oficial
Docker Desktop https://www.docker.com/products/docker-desktop/
Imagen oficial de N8N https://hub.docker.com/r/n8nio/n8n
Docs N8N + Docker https://docs.n8n.io/hosting/installation/docker/
💙 En Lozkorp, serie N8N
Serie N8N (I): Automatiza tu mundo. Definición e instalación en local
Serie N8N (II): Interfaz y Configuración – Comprende tu entorno de trabajo
Serie N8N (V): Control de flujo – Condiciones, decisiones y ramificaciones
Serie N8n (VI): Entender los datos – cómo fluye la información en un workflow
Serie N8N (VII): Instalar N8N con Docker – del local al servidor sin miedo
📦 Descargar el workflow de este artículo: LK_n8n_wf_API_FraseDelDia_Docker.json





















Comentarios