In this post I’ll talk about building a custom Node-RED Docker container that adds the storage and authentication plugins I build earlier, along with disabling a couple of the core nodes that don’t make much sense on a platform where the local disk isn’t really usable.
Settings.js
The same modifications to the settings.js
from the last two posts need to be added to enabled the storage and authentication modules. The MongoDB URI and the AppName are populated with environment variables that we can pass in different values when starting the container.
We will also add the nodeExcludes
entry which removes the nodes that interact with files on the local file system as we don’t want users saving things into the container which will get lost if we have to restart. It also removes the exec
node since we don’t want users running arbitrary commands inside the container.
Setting the autoInstallModules
to true
means that if the container gets restarted then any extra nodes the user has installed with the Palette Manager will get reinstalled.
... storageModule: require('node-red-contrib-storage-mongodb'), mongodbSettings: { mongoURI: process.env["MONGO_URL"], appname: process.env["APP_NAME"] }, adminAuth: require('node-red-contrib-auth-mongodb').setup({ mongoURI: process.env["MONGO_URL"], appname: process.env["APP_NAME"] }), nodesExcludes:['90-exec.js','28-tail.js','10-file.js','23-watch.js'], autoInstallModules: true, ...
Dockerfile
This is a pretty easy extension of the default Node-RED container. We add the modified settings.js
from above to the /data
directory in the container (and set the permissions on it) and then install the plugins. Everything else stays the same.
FROM nodered/node-red COPY settings.js /data/ USER root RUN chown -R node-red:root /data USER node-red RUN npm install --no-fund --no-update-notifier --save node-red-contrib-auth-mongodb node-red-contrib-storage-mongodb
We can build this with the following command
$ docker build -t custom-node-red .
It is important to node here I’ve not given a version tag in the FROM
tag, so every time the container is rebuilt it will pull the very latest shipped version. This might not be what you want for a deployed environment where making sure all users are on the same version is probably a good idea from a support point of view. It may also be useful to use the -minimal
tag postfix to use the version of the container based on alpine to reduce the size.
Starting an instance
You can start a new instance with the following command
$ docker run -d -rm -p 1880:1880 -e MONGO_URL=mongodb://mongodb/nodered -e APP_NAME=r1 --name r1 custom-node-red
In this example I’ve mapped the containers port 1880 to the host, but that will only work for a single container or every container will need to be on a different port on the host, for a Multi Tenant solution we need something different and I’ll cover that in the next post.
Thank you! I dream of this too.