n8n 如何构建自定义 Docker 镜像(pnpm build:docker 与 build:deploy)

发布时间:2026/9/9 21:50:31

n8n 如何构建自定义 Docker 镜像(pnpm build:docker 与 build:deploy) n8n 如何构建自定义 Docker 镜像pnpm build:docker 与 build:deploy【免费下载链接】n8nFair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400 integrations.项目地址: https://gitcode.com/GitHub_Trending/n8/n8n这篇文章解决一个问题你改了 n8n 源码或想基于自己的分支构建需要把改动打进一个可以在本地运行、或在 Testcontainers 等环境中使用的自定义 Docker 镜像。自 1.101.0 起n8n 的 Docker 镜像构建要求先有一个预编译的 n8n 应用仓库为此提供了两个入口脚本pnpm build:deploy只产出编译结果和pnpm build:docker编译 构建镜像一步完成。本文基于仓库内 docker/images/n8n/README.md 的 Build Docker Image 章节、根目录 package.json 的脚本定义、scripts/build-n8n.mjs 与 scripts/dockerize-n8n.mjs 的源码整理。前置条件按 package.json 中engines与packageManager字段构建机需要Node.js24.0.0pnpm11.25.0仓库锁定pnpm11.25.0Docker带docker buildx bake支持或 podman。scripts/dockerize-n8n.mjs 的逻辑是优先使用docker buildx bake当 bake 不可用且未强制指定引擎时回退到 podman两者都没有则直接报错退出。注意一个关键约束docker/images/n8n/Dockerfile 通过COPY ./compiled /usr/local/lib/node_modules/n8n把编译产物打进镜像也就是说构建上下文里必须存在compiled目录这个目录只能由pnpm build:deploy即scripts/build-n8n.mjs生成。如果跳过编译直接跑镜像构建scripts/dockerize-n8n.mjs 的checkPrerequisites会检测不到compiled目录并提示Please run build-n8n.mjs first!。主路径一条命令完成编译与镜像构建在仓库根目录执行pnpm build:docker按 package.json 中的定义该脚本等价于node scripts/build-n8n.mjs node scripts/dockerize-n8n.mjsCONTRIBUTING.md 中 Run local instances in different configurations 一节也是同样的用法想从自己的分支构建镜像时在根目录运行pnpm build:docker。这条命令分两个阶段。第一阶段build-n8n.mjs 生成编译产物scripts/build-n8n.mjs 依次做这些事清理旧输出删除上一轮的compiled/n8n 应用与dist/task-runner-javascript/JavaScript task runner目录。这是本脚本的第一类副作用会删除这两个构建输出目录。安装依赖并构建全部包在仓库根目录执行pnpm install --frozen-lockfile然后pnpm build --summarize。生成精简的生产部署以NODE_ENVproduction DOCKER_BUILDtrue pnpm --filtern8n --prod --legacy deploy --no-optional ./compiled把生产闭包部署到compiled/过程中会临时裁剪各包的package.json前端依赖裁剪脚本在成功或失败路径上都会从备份恢复这些文件。部署 task runner 闭包用同样的方式把n8n/task-runner部署到dist/task-runner-javascript/。校验与清单验证裁剪没有误删运行时资产skills、knowledge-base、node-definitions 等检查依赖单实例完整性并向两个输出目录各写一份build-manifest.json。脚本结束时会打印 BUILD SUMMARY包含n8n:与task-runner-javascript:两个输出目录的路径与大小。看到✅ n8n built successfully!说明编译阶段完成。如果设置了N8N_GENERATE_LICENSEStrue还会额外生成 SBOM 和THIRD_PARTY_LICENSES.md该步骤默认跳过属于发布流程可选项。第二阶段dockerize-n8n.mjs 构建镜像scripts/dockerize-n8n.mjs 读取 docker/docker-bake.hcl 作为构建计划CI 使用同一文件默认构建n8n与runners两个目标产出n8nio/n8n:localn8nio/runners:local镜像名与标签可通过环境变量定制脚本头部注释列出了完整清单常用的有环境变量默认值用途IMAGE_BASE_NAMEn8nio/n8nn8n 镜像名IMAGE_TAGlocaln8n 镜像标签RUNNERS_IMAGE_BASE_NAMEn8nio/runnersrunners 镜像名NODE_VERSION/BUILDER_IMAGE/RUNTIME_IMAGE由 docker/docker-bake.hcl 提供默认值基础镜像相关参数直接传给 bakeDOCKER_PLATFORM按本机架构推导linux/amd64或linux/arm64指定目标平台做跨平台构建DOCKER_BUILD_NO_CACHE未设置置为true时加--no-cacheDOCKER_BUILD_BASE_IMAGE未设置置为true时同时构建n8nio/base基础镜像目标DOCKER_BUILD_DISTROLESS未设置置为true时追加构建 distroless 版 runners 镜像CONTAINER_ENGINE未设置强制使用docker或podman两点需要注意当IMAGE_BASE_NAME带 registry 主机即直接推送远程仓库时脚本会直接--push并且要求RUNNERS_IMAGE_BASE_NAME也必须带 registry 主机否则脚本报错退出避免 runners 镜像被推到非预期的仓库。podman 回退路径不支持DOCKER_BUILD_BASE_IMAGE、DOCKER_BUILD_PC、DOCKER_BUILD_TARBALL_DIR设置这些变量走 podman 时会直接报错。替代路径只编译镜像交给别的构建系统如果你的构建流水线用自己的构建器例如独立的 CI 镜像任务不想用dockerize-n8n.mjsdocker/images/n8n/README.md 给出的做法是pnpm run build:deploy即只执行 package.json 中build:deploy对应的node scripts/build-n8n.mjs生成compiled/目录后确保你的构建器上下文包含这个compiled目录。此时可以像 docker/docker-bake.hcl 的n8n目标那样直接构建 docker/images/n8n/Dockerfiledocker build -t n8nio/n8n:local -f docker/images/n8n/Dockerfile .该 Dockerfile 除了拷入./compiled还会在独立的 native-builder 阶段对sqlite3、isolated-vm和confluentinc/kafka-javascript做node-gyp rebuild编译镜像基础运行时不含编译器所以构建时长应包含这部分原生编译。最终镜像EXPOSE 5678/tcp入口是/docker-entrypoint.sh。验证结果构建阶段build-n8n.mjs结束时输出 BUILD SUMMARYDirectory:指向compiled以及build-manifest.json路径。若构建失败脚本报 BUILD PROCESS FAILED!并以非零码退出。镜像阶段dockerize-n8n.mjs成功时打印DOCKER BUILD COMPLETE横幅并列出每个镜像名与大小例如✅ n8nio/n8n:local (size)。同时会在仓库根目录写入docker-build-manifest.json记录构建时间、目标平台、耗时与镜像列表。容器检查构建后可用docker images n8nio/n8n确认本地镜像存在脚本自身也用docker images name --format {{.Size}}读取大小。可运行性镜像构建成功只说明镜像可生成docker/images/n8n/README.md 中给出的启动方式docker run后访问http://localhost:5678同样适用于本地构建的n8nio/n8n:local镜像。限制与适用边界以上流程针对从源码构建本地镜像。如果你不需要自定义镜像CONTRIBUTING.md 提供了替代做法设置N8N_DOCKER_IMAGEn8nio/n8n:latest直接拉取官方镜像跳过本地构建。docker/docker-bake.hcl 中的n8n-pcpointer-compressed目标仅在DOCKER_BUILD_PCtrue时启用docker/images/n8n/README.md 明确说明-pc标签是 n8n Cloud 内部变体no support or stability guarantees普通使用者应使用常规标签。仓库中的build:docker:coverage、build:docker:scan、build:docker:clean等变体服务于覆盖率测试、镜像扫描与强制全量重建不属于本场景的主路径按需参考 package.json 中的定义即可。【免费下载链接】n8nFair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400 integrations.项目地址: https://gitcode.com/GitHub_Trending/n8/n8n创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/9 21:50:31

全埋点方案落地:从事件协议到数据质量治理的完整实践

做APP数据分析的同事经常说:没有用户行为采集,一切优化都是拍脑袋。但真到自己动手做一套全埋点方案时,你会发现手动埋点的工作量远比你想象的大,漏埋、错埋、重复埋点都是日常。前阵子我把整个方案从技术选型做到事件协议&#x…

2026/9/9 21:45:30

PyCharm 2026安装配置指南:从解释器到虚拟环境一次搞定

如果你翻到这篇文章,多半是刚下载完PyCharm,正卡在安装包解压后的那个蓝色向导界面,或者装完之后打开白屏、新建项目时不知道该选哪一行解释器。这个工具我这些年给团队新手配了不知道多少次环境,说实话,PyCharm安装本…

2026/9/9 21:45:30

AI测试助手实战:系统工程师如何用AI提升效率与质量

这两年做系统工程师和测试相关的活儿,一个非常明显的感受是: AI 测试 已经从“能用但鸡肋”进化到“真能帮你省两三个小时”的阶段了。不管是写自动化脚本、排查 Linux 环境问题,还是解析一堆让人头大的日志,AI 这个“超级助手”…

2026/9/9 22:45:48

Wonderdraft+Dungeondraft:从世界地图到战斗场景的地图制作实战指南

做地图这件事,做了这么多年,我越来越觉得它不是一个“画图”的活儿,而是一个“搭建舞台”的活儿。无论是跑团主持人准备一张大陆全景图,还是独立游戏开发者给关卡配一张战斗地图,工具选对了,效率能差出好几…

2026/9/9 22:45:48

融合通信智能化落地指南:从实时转写到智能客服的工程实践

1. 年度主线:我为什么把“智能”当成全年主题1.1 客户问得最多的三个问题今年我跑了大大小小二十来个融合通信相关的项目,从金融行业的呼叫中心,到连锁零售的门店通信,再到底层通信能力平台的改造,几乎每一家客户在聊需…

2026/9/9 22:45:47

朋友圈运营底层逻辑与实战方法论:从人设定位到内容比例

简介:面向Python开发者的PyQt实战课程资源,以构建视频监控系统为主线,适合希望掌握GUI编程、多媒体处理及多线程开发的读者。教程从PyQt基础组件与布局管理讲起,逐步深入QMediaPlayer视频播放、OpenCV摄像头接入、信号与槽机制、事…

2026/9/9 22:45:47

从零用Python和Pygame写俄罗斯方块:核心逻辑与实战

简介:这是一份基于Python语言实现的俄罗斯方块小游戏源码包,主要面向Python初学者、游戏开发爱好者以及需要课程设计的同学。压缩包内共包含4个文件,以1个核心Python脚本为主,另附2个wav格式游戏音效和1个mp3背景音乐,…

2026/9/9 22:40:47

数据仓库不是更大的数据库:从OLTP到OLAP的架构解析与实践

1. 先回答一个几乎所有人都会问的问题:数据仓库到底是不是一种“更大的数据库” 如果有人问我数据仓库和数据库的区别,我通常不会直接甩定义,而是先反问一句:你最近一次用数据库,是查一条订单,还是统计一万…

2026/9/9 13:11:35

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/8 7:15:15

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/9 0:00:48

MHS模型硬件标准:让大模型像调用软件一样控制物理设备

让Claude真正看着显微镜说“这个细胞形态不太对”,或者让大模型自己调一版机械臂的运动轨迹,这事儿听上去已经很接近科幻片了。但你真上手试一次就会发现,模型不缺智商,缺的是一个能插进显微镜、机械臂、激光控制器里的“通用插座…

2026/9/9 0:00:48

AI五大核心方向详解:从机器学习到大模型,零基础转行选哪条?

会有人告诉我,他想转行学AI,但打开招聘网站一看直接傻眼:机器学习、深度学习、自然语言处理、计算机视觉、大模型应用……满屏都是这些词,好像每个都会一点,又好像每个都离自己很远。还有人上来就问“学Python还是学Ja…

2026/9/9 0:00:49

从50行最小循环到生产级AI引擎:工程化改造全解析

直接说干货。这一章我写的不是那种"hello world跑通某个模型"的教程,而是把AI引擎当做一个真正要上线、要被人调用、要扛流量的系统来聊。从最初只有50行的最小循环,到能够承载生产流量的AI引擎,中间差的不是代码量,而是…

2026/9/7 16:23:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/7 22:46:00

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/9 10:21:54

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码