如何在 git 的多个环境中 运行 Docker 上的 Node-Red

How to run Node-Red on Docker with multiple environments with git

我在我的服务器上 运行 Node-Red,我希望它遵循部署过程,就像我们在本地处理代码一样,使更改、提交和推送。

这是要求列表:

为了更准确,我需要将 flows.jsonsettings.jsonpackage.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 存储库,您将得到一个名为 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-Red 启动命令
npm --no-update-notifier --no-fund start --cache /data/.npm -- --userDir /data

在此命令之前,我们将采用 custom 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 文件中 turn it on

由于是Node-Red官方支持的方案(预览版),强烈推荐。 AFAIK,自动安装新添加的软件包不会解决您的问题,但另一方面,它可以让您更好地控制更改的内容,需要安装的内容以及缺少的内容,in复杂系统.