Dockerfile:
FROM alpine:latest AS alpine
FROM n8nio/runners:latest
# Copy apk and its deps from Alpine
COPY --from=alpine /sbin/apk /sbin/apk
COPY --from=alpine /usr/lib/libapk.so* /usr/lib/
USER root
# ==========================================
# 0. 系统基础环境
# ==========================================
RUN sed -i 's/^#\(.*community\)/\1/g' /etc/apk/repositories
RUN apk update
# -----------------------------------------------------------
# 关键修改:安装 build-base 和 cmake
# 虽然我们改为用系统包装 opencv,但保留这些工具可以防止其他包编译失败
# -----------------------------------------------------------
RUN apk add --no-cache ffmpeg libstdc++ libffi-dev build-base cmake python3-dev
# ==========================================
# 1. JavaScript 模块
# ==========================================
WORKDIR /opt/runners/task-runner-javascript
RUN pnpm add lodash
RUN pnpm add uuid
RUN pnpm add qs
RUN pnpm add axios
RUN pnpm add cheerio
RUN pnpm add form-data
RUN pnpm add xml2js
RUN pnpm add moment
RUN pnpm add luxon
RUN pnpm add date-fns
# ==========================================
# 2. Python 模块
# ==========================================
WORKDIR /opt/runners/task-runner-python
RUN uv pip install requests
RUN uv pip install pytz
RUN uv pip install pyyaml
RUN uv pip install beautifulsoup4
RUN uv pip install lxml
# -----------------------------------------------------------
# 重点修改:用系统包 (apk) 替代 pip 安装
# -----------------------------------------------------------
# Numpy, Pandas, OpenCV 在 Alpine 上编译极其困难且慢。
# 我们直接安装 Alpine 官方提供的预编译版本。
# Python 会自动在系统路径 (/usr/lib/python...) 找到它们。
RUN apk add --no-cache py3-numpy py3-pandas py3-opencv
# -----------------------------------------------------------
# 安装 MoviePy
# -----------------------------------------------------------
# 注意:MoviePy 依赖 numpy。由于我们上面用 apk 安装了 numpy,
# 为了防止 uv 又去重新下载编译 numpy,我们加上 --system 参数或忽略依赖
# 但为了稳妥,直接安装 moviepy,如果它要编译依赖,我们已经装了 build-base
RUN uv pip install moviepy
RUN uv pip install pandas
RUN uv pip install opencv-python --verbose
#RUN uv pip install opencv-python-headless
RUN uv pip install pymongo
RUN uv pip install redis
RUN uv pip install hiredis
RUN uv pip install ffmpeg
# ==========================================
# 3. 收尾
# ==========================================
WORKDIR /
COPY n8n-task-runners.json /etc/n8n-task-runners.json
USER runner
n8n-task-runners.json:
{
"task-runners": [
{
"runner-type": "javascript",
"workdir": "/home/runner",
"command": "/usr/local/bin/node",
"args": [
"--disallow-code-generation-from-strings",
"--disable-proto=delete",
"/opt/runners/task-runner-javascript/dist/start.js"
],
"health-check-server-port": "5681",
"allowed-env": [
"PATH",
"GENERIC_TIMEZONE",
"NODE_OPTIONS",
"N8N_RUNNERS_AUTO_SHUTDOWN_TIMEOUT",
"N8N_RUNNERS_TASK_TIMEOUT",
"N8N_RUNNERS_MAX_CONCURRENCY",
"N8N_SENTRY_DSN",
"N8N_VERSION",
"ENVIRONMENT",
"DEPLOYMENT_NAME"
],
"env-overrides": {
"NODE_FUNCTION_ALLOW_BUILTIN": "crypto,util,url,querystring,buffer,path,zlib,os,events,stream",
"NODE_FUNCTION_ALLOW_EXTERNAL": "lodash,axios,moment,luxon,date-fns,uuid,cheerio,qs,xml2js,form-data",
"N8N_RUNNERS_HEALTH_CHECK_SERVER_HOST": "0.0.0.0"
}
},
{
"runner-type": "python",
"workdir": "/home/runner",
"command": "/opt/runners/task-runner-python/.venv/bin/python",
"args": ["-m", "src.main"],
"health-check-server-port": "5682",
"allowed-env": [
"PATH",
"N8N_RUNNERS_LAUNCHER_LOG_LEVEL",
"N8N_RUNNERS_AUTO_SHUTDOWN_TIMEOUT",
"N8N_RUNNERS_TASK_TIMEOUT",
"N8N_RUNNERS_MAX_CONCURRENCY",
"N8N_SENTRY_DSN",
"N8N_VERSION",
"ENVIRONMENT",
"DEPLOYMENT_NAME"
],
"env-overrides": {
"PYTHONPATH": "/opt/runners/task-runner-python",
"N8N_RUNNERS_STDLIB_ALLOW": "json,math,re,datetime,time,random,hashlib,hmac,base64,urllib,collections,itertools,functools,uuid,typing,os,sys,subprocess",
"N8N_RUNNERS_EXTERNAL_ALLOW": "requests,numpy,pandas,pytz,beautifulsoup4,lxml,pyyaml,cv2,moviepy,pymongo,redis,hiredis,ffmpeg,allin1"
}
}
]
}
Content type
Image
Digest
sha256:d8b3ba319…
Size
1 GB
Last updated
3 months ago
docker pull successage/n8n-runner