Search code examples
node.jsdockerdockerfilenode-red

Building a custom Node-RED image


I would like to make my own Node-RED docker image so when I start it the flows are loaded and Node-RED is ready to go.

The flow I want to load is placed in a 'flows.json' file. And when I import it manually via the interface it works fine.

The Node-RED documentation for docker suggests the following line for starting Node-RED with a custom flow

$ docker run -it -p 1880:1880 -e FLOWS=my_flows.json nodered/node-red-docker

However when I try to do this the flow ends up empty.

I suspect this has to do something with the fact that the flow I'm trying to load is using the 'node-red-node-mongodb' plug-in, which is not installed by default.

How can I build a Node-RED image where the 'node-red-node-mongodb' is already installed?

If anymore information is required please ask.

UPDATE

I made the following Dockerfile:

FROM nodered/node-red-docker

RUN npm install node-red-node-mongodb

Then I build it with:

docker build -t testenvironment/nodered .

And started it with:

docker run -d -p 1880:1880 -e FLOWS=flows.json --name node-red testenvironment/nodered

But when I go to the Node-RED interface there is no flow. Also I don't see the MongoDB node in the sidebar.


Solution

  • The documentation on the Node-RED site includes instructions for how to customise a Docker image and add extra nodes. You can either do it by logging into the existing image using docker exec and installing the node by hand with npm

    # Open a shell in the container
    docker exec -it mynodered /bin/bash
    
    # Once inside the container, npm install the nodes in /data
    cd /data
    npm install node-red-node-mongodb
    exit
    
    # Restart the container to load the new nodes
    docker stop mynodered
    docker start mynodered
    

    Else you can extend the image by creating your own Docker file:

    FROM nodered/node-red-docker
    RUN npm install node-red-node-mongodb
    

    And then build it with

    docker build -t mynodered:<tag> .