top of page

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.


Serie N8N (VIII): Ejecutar workflows en Docker y resolver problemas de acceso a archivos
Ejecutar workflows en Docker

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


Workflow frase del día
Workflow frase del día

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.json

Esto 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 directory

o 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\Downloads

esa 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\Downloads

o en sistemas Linux/Mac:

/home/usuario/Downloads

Aquí 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\Downloads

no 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_data

Este 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_data

Ese 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:

Creación volúmenes de datos en Docker Desktop
Creación volúmenes de datos en Docker Desktop

Usando una terminal

Abrimos una terminal y ejecutamos:

docker volume create n8n_files

Este comando crea un volumen Docker independiente llamado:

n8n_files

Este 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

Terminal: listado volúmenes
Terminal: listado volúmenes


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:

/files

y 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_data

que se encargaba de guardar la configuración interna de N8N.

Ahora vamos a añadir un segundo volumen para archivos generados por workflows:

n8n_files

De 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


Docker Desktop - Images
Docker Desktop - Images

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.


Parámetros container n8n
Parámetros container n8n

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


Nuevo container n8n
Nuevo container n8n

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/n8n

Este 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:

/files

se 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=/files

Esta 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.json

Esa 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:

/files

Todo 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')}}.json

Esto 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
Nodo Read/Write N8N
Nodo Read/Write N8N

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

Archivo creado en el volumen n8n_files
Archivo creado en el volumen n8n_files

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 sh

Este 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 /files

Cuando hayas terminado puedes salir de la shell con:

exit
Ver archivos desde la Terminal
Ver archivos desde la Terminal

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 env

Este 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.


Variables de entorno del contenedor
Variables de entorno del contenedor

Entrar al contenedor

Si queremos explorar el contenedor manualmente podemos abrir una shell dentro de él:

docker exec -it n8n sh

Esto nos permite ejecutar comandos directamente dentro del contenedor. Por ejemplo:

ls /files

para ver los archivos generados por los workflows.

Para salir del contenedor:

exit

Ver los contenedores activos

Para ver qué contenedores Docker están en ejecución podemos usar:

docker ps
Contenedores activos
Contenedores activos

Esto confirma que el contenedor de N8N está funcionando.


Ver los volúmenes creados

También podemos listar los volúmenes disponibles:

docker volume ls

Ver información detallada de un volumen


Si queremos ver más información sobre un volumen concreto podemos usar:

docker volume inspect n8n_files

Esto mostrará la ruta interna donde Docker guarda ese volumen.


Información volumen
Información 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 sh

Una vez dentro podemos crear una nueva carpeta dentro de /files. En este ejemplo vamos a crear una carpeta llamada LK:

mkdir /files/LK

Ahora podemos comprobar que la carpeta se ha creado correctamente ejecutando:

ls /files

Guardar 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')}}.json

De 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_files

Esto 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_files

Esta 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/n8n

La línea importante es esta:

-v C:\n8n_files:/files

Esto 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


💙 En Lozkorp, serie N8N


📦 Descargar el workflow de este artículo: LK_n8n_wf_API_FraseDelDia_Docker.json


Comentarios


© 2025 by Lozkorp                                                         

bottom of page