我正在我的服务器上运行Node-Red,我希望它遵循部署过程,就像我们对代码所做的那样——在本地工作,进行更改,提交和推送。
以下是需求列表:
- 在Docker上运行Node-Red。
- 跟踪和备份任务,配置,所有与Git
- 能够克隆存储库并启动Node-Red,无需任何配置。 在我的本地机器上做更改,并通过push到Git来部署它们。
为了更准确,我需要将flows.json
,settings.json
和package.json
添加到git中。
和一个主要问题是,当我添加一个新的包到package.json
,NodeRed将不会自动安装它。
我发现的解决方案(变通方法)是基于将npm install
添加到docker入口点,它是如何工作的?
挂载到本地文件夹
首先,我们要运行Node-Red,并将其/data
卷挂载到本地文件夹:
docker run -p 1880:1880 -v $(pwd)/node-red:/data nodered/node-red
现在,如果你从本地的git repo运行,你会得到一个名为node-red
的文件夹,它将包含所有的Node-Red工作区。
添加Node-Red数据Git
要只跟踪Node-Red配置文件,您需要将下一个条目添加到您的.gitignore
文件:
node-red/*
!node-red/package.json
!node-red/package-lock.json
!node-red/flows.json
!node-red/flows_cred.json
!node-red/settings.js
所有其他文件都是自动生成的。
在启动时安装丢失的软件包
现在,困难的部分。如果您在本地环境中添加了一个新库,并且您推送了更改,您希望Node-Red在启动之前安装新库。
我们将从Node-Red Dockerfile中获取原始的Node-Redstart命令:
npm --no-update-notifier --no-fund start --cache /data/.npm -- --userDir /data
在此命令之前,我们将使用自定义docker的npm install
命令:
npm install --unsafe-perm --no-update-notifier --no-fund --only=production
下面是我最后的docker-compose.yml
文件,它包含一个docker run
命令行,在开发环境中只运行这个映像:
node-red:
# port 1880
# Dev: docker run -p 1880:1880 -v $(pwd)/node-red:/data --entrypoint="" --env-file .env nodered/node-red /bin/sh -c "npm install --prefix /data --unsafe-perm --no-update-notifier --no-fund --only=production && npm --no-update-notifier --no-fund start --cache /data/.npm -- --userDir /data"
image: nodered/node-red
env_file:
- shared.env
network_mode: host
entrypoint: >
sh -c "
npm install --prefix /data --unsafe-perm --no-update-notifier --no-fund --only=production
&& npm --no-update-notifier --no-fund start --cache /data/.npm -- --userDir /data"
environment:
NODE_RED_CREDENTIAL_SECRET: ${NODE_RED_CREDENTIAL_SECRET}
volumes:
- ./node-red:/data
restart: unless-stopped
您可以考虑使用名为Projects的新(预览)功能。
有了这个特性,Git源代码控制被集成到Node-Red实例中,并向您显示更改、丢失的包、提交历史等等。
要启用此功能,您需要在settings.json
文件中打开它。
由于它是由Node-Red(预览版)正式支持的解决方案,因此强烈推荐使用它。当然,它不能解决你自动安装新添加的包的问题,但另一方面,它给了你一个更好的控制什么被改变,什么需要安装,什么缺失,在复杂的系统.