n8n을 Docker로 Windows에 설치하기 — Python까지 쓰려면 Dockerfile 직접 짜야 한다
n8n 공식 Docker 이미지로 시작했다가 Python 스크립트가 안 돌아서 Dockerfile 직접 만든 과정. 삽질 기록.
n8n이 뭔가
n8n은 노드 기반 자동화 도구입니다. Make(구 Integromat), Zapier 같은 거지만 오픈소스라 로컬에서 돌릴 수 있습니다.
JARVIS 시스템에서 뉴스 수집 → 처리 → 발행 워크플로우를 n8n으로 연결하려 했습니다.
공식 이미지로 시작
docker run -p 5678:5678 n8nio/n8n
바로 됩니다. localhost:5678에서 UI 열립니다.
문제: Python 스크립트를 실행하는 노드를 만들었는데 python3: not found.
공식 n8n 이미지에는 Python이 없습니다. Node.js만 있습니다.
해결책: Dockerfile 직접 작성
FROM node:20-slim
RUN apt-get update --fix-missing && \
apt-get install -y python3 python3-pip python3-venv git build-essential
RUN npm install -g n8n
ENV VIRTUAL_ENV=/opt/venv
RUN python3 -m venv $VIRTUAL_ENV
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
RUN pip install --no-cache-dir requests beautifulsoup4 feedparser Pillow trafilatura lxml_html_clean
WORKDIR /data
CMD ["n8n"]
포인트:
node:20-slim베이스 이미지 (n8n 권장 버전)- Python 가상환경 필수: 최신 pip가 시스템에 직접 설치하면 에러 냄
trafilatura,lxml_html_clean: 웹 스크래핑용. 이거 없으면 기사 본문 추출 안 됨
docker-compose.yml
version: '3.1'
services:
n8n:
build: .
ports:
- "5678:5678"
environment:
- N8N_RUNNERS_ENABLED=true
- NODE_FUNCTION_ALLOW_BUILTIN=child_process,fs,os
- NODE_FUNCTION_ALLOW_EXTERNAL=*
volumes:
- ./n8n_data:/home/node/.n8n
- C:/dev/jarvis:/data
중요한 환경변수:
NODE_FUNCTION_ALLOW_BUILTIN=child_process,fs,os
n8n의 Code 노드에서 Node.js 내장 모듈을 쓰려면 명시적으로 허용해야 합니다. 없으면 require('child_process')가 보안 오류로 막힙니다.
NODE_FUNCTION_ALLOW_EXTERNAL=*
외부 npm 패키지 사용 허용. *는 전부 허용.
데이터 저장 위치
volumes:
- ./n8n_data:/home/node/.n8n
./n8n_data 폴더에 n8n 설정, 워크플로우, 크리덴셜이 저장됩니다. Docker 컨테이너를 재생성해도 데이터 유지.
빌드 및 실행
# 빌드 (처음 한 번, 또는 Dockerfile 변경 시)
docker-compose build
# 실행
docker-compose up -d
# 로그 확인
docker-compose logs -f n8n
빌드 시간: 5~10분 (pip 패키지 설치 포함).
겪었던 문제들
문제 1: lxml_html_clean 없으면 trafilatura 에러
ImportError: cannot import name 'html_clean' from 'lxml'
trafilatura가 내부적으로 lxml_html_clean을 씁니다. 같이 설치해야 합니다.
RUN pip install trafilatura lxml_html_clean
문제 2: Code 노드에서 child_process 막힘
n8n Code 노드에서 Python 스크립트를 실행하려고 child_process.exec를 쓰면:
Error: child_process is not allowed
NODE_FUNCTION_ALLOW_BUILTIN=child_process 없으면 막힙니다. docker-compose.yml에 환경변수 추가 후 재시작.
문제 3: 볼륨 마운트 경로 (Windows)
volumes:
- C:/dev/jarvis:/data
Windows 경로는 슬래시(/) 구분자를 씁니다. 백슬래시(\) 쓰면 오류.
n8n에서 Python 스크립트 실행하기
Code 노드 (JavaScript):
const { exec } = require('child_process');
const { promisify } = require('util');
const execAsync = promisify(exec);
const result = await execAsync('python3 /data/my_script.py');
return [{ json: { output: result.stdout } }];
/data는 C:/dev/jarvis로 마운트돼 있어서 로컬 Python 스크립트를 실행할 수 있습니다.
현재 상태
n8n은 JARVIS 시스템에서 뉴스 수집과 처리 부분에 씁니다. Python 봇들과 연동해서 워크플로우를 구성합니다.
다만 복잡한 로직은 Python 스크립트 직접 실행이 편합니다. n8n은 시각적 워크플로우 확인과 트리거 관리에 적합합니다.