######################################## # EVOLV — Node-RED Development Image ######################################## FROM nodered/node-red:latest # Install curl for health checks USER root RUN apk add --no-cache curl # Set working directory to the EVOLV bind mount location. # Create + chown explicitly so the unprivileged node-red user can # write `node_modules` during `npm install` below. Without this the # WORKDIR is created as root and npm fails with EACCES. RUN mkdir -p /data/evolv && chown -R node-red:node-red /data/evolv WORKDIR /data/evolv USER node-red # ------------------------------------------------------- # Layer-cache: copy dependency manifests first # ------------------------------------------------------- COPY --chown=node-red:node-red package.json package-lock.json* ./ # Copy generalFunctions early (it's a file: dependency) COPY --chown=node-red:node-red nodes/generalFunctions/ ./nodes/generalFunctions/ # Install dependencies — skip scripts to avoid unused TensorFlow native build RUN npm install --ignore-scripts # Install Node-RED palette nodes used by demo flows RUN cd /usr/src/node-red && npm install @flowfuse/node-red-dashboard # ------------------------------------------------------- # Copy entrypoint and settings # ------------------------------------------------------- COPY --chown=node-red:node-red docker/entrypoint.sh /data/evolv/docker/entrypoint.sh COPY --chown=node-red:node-red docker/settings.js /data/evolv/docker/settings.js # ------------------------------------------------------- # Health check: Node-RED admin API # ------------------------------------------------------- HEALTHCHECK --interval=15s --timeout=5s --start-period=30s --retries=3 \ CMD curl -sf http://localhost:1880/nodes || exit 1 # ------------------------------------------------------- # Entrypoint # ------------------------------------------------------- ENTRYPOINT ["sh", "/data/evolv/docker/entrypoint.sh"]