F. Aragona
F. Aragona

Reputation: 79

Docker NodeRed committed container does not maintain flows and modules

I'm working on a project using NodeRed deployed with docker and I would like to save the state of my deployment, including flows, settings and new added modules so that I can save the image and load it on another host replicating exactly the same NodeRed instance.

I created the container using:

docker run -itd --name my-nodered node-red

After implementing the flows and installing some custom modules, with the container running I used this command:

docker commit my-nodered my-project-nodered/my-nodered:version1
docker save my-project-nodered/my-nodered:version1 > tar-archive.tar.gz

And on another machine I'd imported the image using:

docker load < tar-archive.tar.gz

And run it using:

docker run -itd my-project-nodered/my-nodered:version1

And I obtain a vanilla NodeRed docker container with a default /data directory and just the files on the data directory maintained.

What am I missing? It could be possibile that my /data directory is overwrittenm as well as my settings.js file in the home directory? And in this case, which is the best practice to achieve my target?

Thank you a lot in advance

Upvotes: 1

Views: 932

Answers (1)

Adiii
Adiii

Reputation: 59986

commit will not work, as you can see that there is volume defined in the Dockerfile.

# User configuration directory volume
VOLUME ["/data"]

That makes it impossible to create a derived image with any different content in that directory tree. (This is the same reason you can't create a mysql or postgresql image with prepopulated data.)

docker commit doesn't consider volumes at all, so you'll get an unchanged image with nothing preloaded in it.

You can see the offical documentation

Managing User Data

Once you have Node-RED running with Docker, we need to ensure any added nodes or flows are not lost if the container is destroyed. This user data can be persisted by mounting a data directory to a volume outside the container. This can either be done using a bind mount or a named data volume.

Node-RED uses the /data directory inside the container to store user configuration data.

nodered-user-data-in-docker

one way is to restore the your config file on another machine, for example backup-config then

docker run -it -p 1880:1880 -v $PWD/backup-config/:/data --name mynodered nodered/node-red-docker

or if you want to full for some repo then you can try

docker run -it --rm -v "$PWD/$(wget https://raw.githubusercontent.com/openenergymonitor/oem_node-red/master/flows_emonpi.json)":/data/ nodered/node-red-docker

Upvotes: 2

Related Questions