n8n 的极简 Dockerfile

解决官方镜像在 rootless 环境下的权限问题

前言

n8n 官方的 Docker 镜像使用预先指定的用户运行,这在某些特定环境(例如 rootless podman 或 rootless docker)中可能会引发文件权限问题。

本文提供了一个极简的 n8n Dockerfile,直接使用 npm 命令安装 n8n,易于理解且能有效避免权限困扰。

Dockerfile

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
FROM node:alpine

ARG N8N_VERSION=1.103.2

ENV N8N_USER_FOLDER=/data
ENV NODE_ENV=production

# 安装必要的依赖项和 n8n
RUN apk add --no-cache tzdata git openssh openssl graphicsmagick ca-certificates jq libc6-compat \
    && npm i n8n@${N8N_VERSION} -g \
    && rm -rf ${HOME}/.npm

# 设置数据卷和工作目录
VOLUME /data
WORKDIR /data

ENTRYPOINT ["n8n", "start"]

Dockerfile 解析:

  • FROM node:alpine: 使用轻量的 node:alpine 作为基础镜像。
  • ARG N8N_VERSION: 将 n8n 版本定义为构建参数,方便后续升级,只需修改此处的版本号即可。
  • ENV:
    • N8N_USER_FOLDER=/data: 指定 n8n 的数据存储目录。
    • NODE_ENV=production: 设置为生产环境模式。
  • RUN:
    1. 使用 apk 安装 n8n 运行所需的系统依赖。
    2. 通过 npm 全局安装指定版本的 n8n。
    3. 清理 npm 缓存以减小镜像体积。
  • VOLUME /data: 声明 /data 目录为数据卷,用于持久化存储 n8n 的数据。
  • WORKDIR /data: 设置工作目录为 /data
  • ENTRYPOINT ["n8n", "start"]: 定义容器启动时执行的命令。

环境变量

运行时,可以通过环境变量来配置 n8n 的行为。以下是一些常用的环境变量:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 时区设置
GENERIC_TIMEZONE=Asia/Shanghai

# 监听地址和端口
N8N_LISTEN_ADDRESS=0.0.0.0
N8N_PORT=5678

# Webhook 和主机配置
WEBHOOK_URL=https://n8n.example.com/
N8N_PROTOCOL=https
N8N_HOST=n8n.example.com

# 启用 n8n 的执行器 (Runner)
N8N_RUNNERS_ENABLED=true

运行容器

使用以下命令来构建和运行 n8n 容器。

1. 构建镜像

1
docker build -t n8n-custom .

2. 运行容器

1
2
3
4
5
6
7
8
9
docker run -d \
    --name=n8n \
    -p 5678:5678 \
    -v /path/to/local/n8n_data:/data \
    -e GENERIC_TIMEZONE="Asia/Shanghai" \
    -e N8N_LISTEN_ADDRESS="0.0.0.0" \
    -e N8N_PORT="5678" \
    --restart always \
    n8n-custom

命令解析:

  • -d: 后台运行容器。
  • --name=n8n: 为容器指定一个名称。
  • -p 5678:5678: 将主机的 5678 端口映射到容器的 5678 端口。
  • -v /path/to/local/n8n_data:/data: 将本地目录挂载到容器的 /data 目录,用于持久化存储数据。请务必将 /path/to/local/n8n_data 替换为你的实际路径
  • -e: 设置环境变量。
  • --restart always: 使容器在退出时总是自动重启。
使用 Hugo 构建
主题 StackJimmy 设计