From 7baa1a07f94d1c2de5653c76af6f532bde7ae49b Mon Sep 17 00:00:00 2001 From: Mitchell R Date: Tue, 19 May 2026 03:57:42 +0200 Subject: [PATCH] fix(nodered): seed /data/settings.js via entrypoint wrapper MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The /data named volume hides anything Dockerfile COPYs into /data, so the previous CMD override pointing at /usr/src/bf-settings.js didn't help — Node-RED's launch script still looks for /data/settings.js by default, which doesn't exist after the volume overlays. Solution: entrypoint wrapper copies /usr/src/bf-settings.js to /data/settings.js on first boot when missing, then exec's npm start. Subsequent boots keep the user-edited version in the volume. --- deploy/docker/Dockerfile.nodered | 11 +++++++---- deploy/docker/nodered-entrypoint.sh | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) create mode 100755 deploy/docker/nodered-entrypoint.sh diff --git a/deploy/docker/Dockerfile.nodered b/deploy/docker/Dockerfile.nodered index 624b05c..573201a 100644 --- a/deploy/docker/Dockerfile.nodered +++ b/deploy/docker/Dockerfile.nodered @@ -11,9 +11,12 @@ USER root # Copy our nodes into a path outside /data (which is volume-mounted) COPY nodered /usr/src/betterframe-nodes -# Settings file at a non-/data path so the nodered-data volume doesn't -# overlay it. CMD passes --settings to point Node-RED at it. +# Settings template + entrypoint that seeds /data/settings.js on first boot +# (the /data named volume hides anything we COPY directly there, so we have +# to plant the file after the volume mount comes up). COPY deploy/docker/nodered-settings.js /usr/src/bf-settings.js +COPY deploy/docker/nodered-entrypoint.sh /usr/local/bin/bf-nodered-entrypoint +RUN chmod +x /usr/local/bin/bf-nodered-entrypoint # Install deps for the nodes RUN cd /usr/src/betterframe-nodes && \ @@ -22,5 +25,5 @@ RUN cd /usr/src/betterframe-nodes && \ USER node-red -# Override the default CMD to use the baked settings.js. -CMD ["npm", "start", "--cache", "/data/.npm", "--", "--userDir", "/data", "--settings", "/usr/src/bf-settings.js"] +ENTRYPOINT ["/usr/local/bin/bf-nodered-entrypoint"] +CMD [] diff --git a/deploy/docker/nodered-entrypoint.sh b/deploy/docker/nodered-entrypoint.sh new file mode 100755 index 0000000..9356986 --- /dev/null +++ b/deploy/docker/nodered-entrypoint.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env sh +# Seed /data/settings.js with our BF defaults on first boot. +# /data is volume-mounted, so the COPY in the Dockerfile gets hidden +# unless we plant a copy after the mount comes up. +set -eu + +DATA=/data +TPL=/usr/src/bf-settings.js + +if [ ! -f "$DATA/settings.js" ]; then + echo "[bf-nodered] seeding $DATA/settings.js from $TPL" + cp "$TPL" "$DATA/settings.js" +fi + +# Exec the upstream nodered entrypoint args verbatim. +exec npm start --cache /data/.npm -- --userDir /data "$@"