n8n을 Docker로 Windows에 설치하기 — Python까지 쓰려면 Dockerfile 직접 짜야 한다

n8n 공식 Docker 이미지로 시작했다가 Python 스크립트가 안 돌아서 Dockerfile 직접 만든 과정. 삽질 기록.

n8n을 Docker로 Windows에 설치하기 — 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 } }];

/dataC:/dev/jarvis로 마운트돼 있어서 로컬 Python 스크립트를 실행할 수 있습니다.


현재 상태

n8n은 JARVIS 시스템에서 뉴스 수집과 처리 부분에 씁니다. Python 봇들과 연동해서 워크플로우를 구성합니다.

다만 복잡한 로직은 Python 스크립트 직접 실행이 편합니다. n8n은 시각적 워크플로우 확인과 트리거 관리에 적합합니다.

#n8n#Docker#Windows#Python#자동화