n8n的Code节点虽然支持Python脚本执行,但由于运行在受限的沙盒环境,无法直接加载像 pandas、requests 这样的第三方库,这使得复杂的数据处理和业务逻辑实现受到很大限制。本文将分享一种实用的持久化解决方案,借助 Docker 容器挂载和虚拟环境技术,让你在 n8n 内自由安装并调用任何 Python 库,并保证容器升级也不会丢失已安装环境。
为什么会遇到限制?
n8n默认的Python运行环境非常简化,虽然可以写代码,但无法安装额外库,意味着许多高级功能无法实现,严重限制了自动化工作流的灵活性。
支持的第三方库 https://pyodide.org/en/stable/usage/packages-in-pyodide.html
解决思路简述
- 使用 Docker 部署 n8n,且挂载本地目录作为持久化存储
- 在容器内部建立可持久保存的 Python 虚拟环境
- 通过 n8n 的命令执行节点安装所需库
- 在工作流中调用容器内外部的 Python 脚本
具体实现步骤
1. 基于Docker运行n8n并配置数据挂载
bash
docker run -d --restart=unless-stopped \
--name n8n \
-p 8888:5678 \
-v ~/.n8n:/home/node/.n8n \
-v ~/docker/n8n:/data \
-e TZ=Asia/Shanghai \
-e N8N_TIMEZONE=Asia/Shanghai \
-e GENERIC_TIMEZONE=Asia/Shanghai \
-e N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true \
-e N8N_SECURE_COOKIE=false \
--user node \
n8nio/n8n
我比较喜欢使用脚本的方式
shell
#!/bin/bash
# 当前目录
BASE_DIR="$PWD"
CONFIG_DIR="$BASE_DIR/.n8n"
DATA_DIR="$BASE_DIR/n8n_data"
# 创建目录
mkdir -p "$CONFIG_DIR"
mkdir -p "$DATA_DIR"
# 启动 n8n 容器
docker run -d --restart=unless-stopped \
--name n8n_docker \
-p 8888:5678 \
-v "$CONFIG_DIR":/home/node/.n8n \
-v "$DATA_DIR":/data \
-e N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true \
-e N8N_SECURE_COOKIE=false \
n8nio/n8n
echo "n8n 启动成功!"
echo "配置目录: $CONFIG_DIR"
echo "Python 脚本目录: $DATA_DIR"
echo "Web 访问地址: http://localhost:8888"
重点说明:
- 将
/data
映射到宿主机目录,方便存放虚拟环境和脚本- 端口映射可根据需求自定义
- 开启社区包调用工具功能
2. 进入容器安装虚拟环境工具
执行命令进入容器并安装 virtualenv
:
ps: 要以root进入,不然安装的时候会报没有权限
bash
docker exec -u root -it n8n sh
apk add py3-virtualenv
shell
yuanchangmeng@yuanchangmeng:~/yuanchangmeng/n8n_docker$ docker exec -it -u root n8n_docker sh
/home/node # apk add py3-virtualenv
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/community/x86_64/APKINDEX.tar.gz
(1/66) Installing ca-certificates (20241121-r1)
(2/66) Installing brotli-libs (1.1.0-r2)
(3/66) Installing c-ares (1.34.5-r0)
(4/66) Installing libunistring (1.2-r0)
(5/66) Installing libidn2 (2.3.7-r0)
(6/66) Installing nghttp2-libs (1.64.0-r0)
(7/66) Installing libpsl (0.21.5-r3)
(8/66) Installing zstd-libs (1.5.6-r2)
(9/66) Installing libcurl (8.12.1-r1)
3. 创建持久化的虚拟环境
在容器内执行以下命令:
bash
python3 -m venv /data/venv
chown -R node:node /data/venv
这样虚拟环境就建立在宿主机挂载的目录中,重启或升级容器都不会丢失环境。
权限调整为 node 用户,确保 n8n 内代码可以正常调用。
bash
Executing busybox-1.37.0-r12.trigger
Executing ca-certificates-20241121-r1.trigger
OK: 105 MiB in 83 packages
/home/node # python3 -m venv /data/venv
/home/node # chown -R node:node /data/venv
/home/node # exit
4. 在n8n中安装Python库
使用 Execute Command 节点运行:
bash
/data/venv/bin/pip3 install requests -i https://pypi.tuna.tsinghua.edu.cn/simple

- 一次安装多个库示例:
/data/venv/bin/pip3 install numpy requests pandas
- 指定版本安装:
/data/venv/bin/pip3 install pandas==1.3.5

5. 运行外部Python脚本
将 Python 脚本存放在挂载目录下,例如 ~/docker/n8n/demo.py
,通过命令执行:
bash
import requests
def fetch_example():
url = "https://api.github.com"
response = requests.get(url)
if response.status_code == 200:
print("请求成功!")
print("返回内容:", response.json())
else:
print(f"请求失败,状态码:{response.status_code}")
if __name__ == "__main__":
fetch_example()
bash
/data/venv/bin/python3 /data/demo.py

建议在脚本中添加日志输出和异常处理,便于调试和稳定运行。
方案优势与提示
优势
- 虚拟环境挂载持久化,避免容器升级导致环境丢失
- 无限制安装各种第三方 Python 包
- 脚本管理灵活,支持版本控制
需要注意
- 容器重启时可能需要重新激活环境
- 注意 Python 版本兼容
- 大型库安装耗时较长,建议预先安装
- 谨慎安装非可信包,保证安全