[{"data":1,"prerenderedAt":678},["ShallowReactive",2],{"docs-\u002Fdocs\u002Fcontribute\u002Fcreating-debug-stack-containers\u002F":3,"docs-nav":220},{"id":4,"title":5,"body":6,"description":16,"extension":208,"layout":209,"meta":210,"navGroup":209,"navGroupOrder":209,"navOrder":209,"navTitle":211,"navigation":212,"originalPath":213,"path":214,"redirect":209,"seo":215,"stem":216,"updated":217,"version":218,"__hash__":219},"docs\u002Fdocs\u002Fcontribute\u002Fcreating-debug-stack-containers.md","Creating Debug Stack Containers",{"type":7,"value":8,"toc":200},"minimark",[9,13,17,25,28,31,41,46,57,68,71,81,84,90,97,100,121,128,139,145,148,154,158,170,173,177,180,186,193,197],[10,11,5],"h1",{"id":12},"creating-debug-stack-containers",[14,15,16],"p",{},"Sometimes we want to be able to run some debug code within a stack running in our\nstaging test environment.",[14,18,19,20,24],{},"For example, changes to the ",[21,22,23],"code",{},"nr-launcher"," component or any of the other components\nthat run within the stack.",[14,26,27],{},"This guide shows a simple way to do that without having to rebuild the container\nfrom scratch each time.",[14,29,30],{},"This will require:",[32,33,34,38],"ol",{},[35,36,37],"li",{},"Docker",[35,39,40],{},"A container registry you can push images to. For example, a free DockerHub account where you can push images",[42,43,45],"h3",{"id":44},"creating-a-debug-container","Creating a debug container",[14,47,48,49,52,53,56],{},"Pick an existing container image to use as your starting point. For example, ",[21,50,51],{},"flowfuse\u002Fnode-red:2.5.0-4.0.x","\ncontains ",[21,54,55],{},"nr-launcher@2.5.0"," and the latest Node-RED 4.x release.",[14,58,59,63,64,67],{},[60,61,62],"strong",{},"Note",": our staging environments requires ",[21,65,66],{},"arm64"," based containers. The following instructions work for\nMacs (with M1\u002FM2) - additional steps may be needed for other OS; please contribute them if you know them.",[14,69,70],{},"Use the following command to open a shell into the container:",[72,73,78],"pre",{"className":74,"code":76,"language":77},[75],"language-text","docker run -it --entrypoint \u002Fbin\u002Fbash flowfuse\u002Fnode-red:2.5.0-4.0.x\n","text",[21,79,76],{"__ignoreMap":80},"",[14,82,83],{},"The prompt will then look like this:",[72,85,88],{"className":86,"code":87,"language":77},[75],"e8dcd669ea4c:\u002Fusr\u002Fsrc\u002Fflowforge-nr-launcher$\n",[21,89,87],{"__ignoreMap":80},[14,91,92,93,96],{},"Take a note of the ",[21,94,95],{},"e8dcd669ea4c"," - this is the id of the container instance you have created.",[14,98,99],{},"The following directories are probably of interest:",[101,102,103,112],"ul",{},[35,104,105,108,109,111],{},[21,106,107],{},"\u002Fusr\u002Fsrc\u002Fflowforge-nr-launcher"," - contains the ",[21,110,23],{}," code and its dependencies",[35,113,114,108,117,120],{},[21,115,116],{},"\u002Fusr\u002Fsrc\u002Fnode-red",[21,118,119],{},"node-red"," code",[14,122,123,124,127],{},"Using ",[21,125,126],{},"vi",", you can edit the files to make the changes you want and when you're done, exit the shell.",[14,129,130,131,134,135,138],{},"Having made the changes, use ",[21,132,133],{},"docker commit"," to create a new container image. The command requires\nthe id of the container you've just edited and the tag for the container. It also needs to restore\nthe ",[21,136,137],{},"entrypoint"," configuration back to the default.",[72,140,143],{"className":141,"code":142,"language":77},[75],"docker commit \\\n  --change='ENTRYPOINT [\".\u002Fnode_modules\u002F.bin\u002Fflowfuse-node-red\", \"-p\", \"2880\", \"-n\", \"\u002Fusr\u002Fsrc\u002Fnode-red\"]' \\\n  e8dcd669ea4c \\\n  knolleary\u002Fff-debug:debug-1\n",[21,144,142],{"__ignoreMap":80},[14,146,147],{},"Finally, you can push the new container to your container registry.",[72,149,152],{"className":150,"code":151,"language":77},[75],"docker push knolleary\u002Fff-debug:debug-1\n",[21,153,151],{"__ignoreMap":80},[42,155,157],{"id":156},"using-the-container-in-flowfuse","Using the container in FlowFuse",[14,159,160,161,165,166,169],{},"Debug containers should ",[162,163,164],"em",{},"only"," be used in pre-staging\u002Fstaging environments. Do ",[162,167,168],{},"not"," add to production.",[14,171,172],{},"Once pushed, you can create a custom stack in the FlowFuse admin section and give it the location\nof your container.",[42,174,176],{"id":175},"iterating","Iterating",[14,178,179],{},"If you find you want to add some more debug, repeat the process, however use your existing image\nas the starting point:",[72,181,184],{"className":182,"code":183,"language":77},[75],"docker run -it --entrypoint \u002Fbin\u002Fbash knolleary\u002Fff-debug:debug-1\n",[21,185,183],{"__ignoreMap":80},[14,187,188,189,192],{},"Be sure to increment the number in the image name (",[21,190,191],{},"debug-2",") when you commit and push the new container.",[42,194,196],{"id":195},"tidying-up","Tidying up",[14,198,199],{},"Remember to delete your instances\u002Fstacks once you're done, as well as all of the local\ndocker images and containers that have been created along the way.",{"title":80,"searchDepth":201,"depth":201,"links":202},4,[203,205,206,207],{"id":44,"depth":204,"text":45},3,{"id":156,"depth":204,"text":157},{"id":175,"depth":204,"text":176},{"id":195,"depth":204,"text":196},"md",null,{},"Creating debug stack containers",true,"contribute\u002Fcreating-debug-stack-containers.md","\u002Fdocs\u002Fcontribute\u002Fcreating-debug-stack-containers",{"title":5,"description":16},"docs\u002Fcontribute\u002Fcreating-debug-stack-containers","2026-08-14 20:36:27 +0530","2.33.2","H4TQAF51NBDZTYnOEt6x041cNwDYK-UQK2fAQQCYQ4g",[221,230,249,261],{"name":222,"order":223,"children":224},"FlowFuse User Manuals",1,[225],{"title":226,"path":227,"group":222,"groupOrder":223,"order":228,"children":229},"FlowFuse API","\u002Fdocs\u002Fapi",2,[],{"name":231,"order":201,"children":232},"FlowFuse Self-Hosted",[233,237],{"title":234,"path":235,"group":231,"groupOrder":201,"order":223,"children":236},"Quick Start","\u002Fdocs\u002Fquick-start",[],{"title":238,"path":239,"group":231,"groupOrder":201,"order":204,"children":240},"Upgrading FlowFuse","\u002Fdocs\u002Fupgrade",[241,245],{"title":242,"path":243,"order":209,"children":244},"Installing a license","\u002Fdocs\u002Fupgrade\u002Fopen-source-to-premium",[],{"title":246,"path":247,"order":209,"children":248},"Upgrading the Node-RED version","\u002Fdocs\u002Fupgrade\u002Fnodered-version",[],{"name":250,"order":251,"children":252},"Support",5,[253,257],{"title":254,"path":255,"group":250,"groupOrder":251,"order":204,"children":256},"Premium Support","\u002Fdocs\u002Fpremium-support",[],{"title":258,"path":259,"group":250,"groupOrder":251,"order":209,"children":260},"Debugging Node-RED issues","\u002Fdocs\u002Fdebugging",[],{"name":262,"order":209,"children":263},"Other",[264,312,324,401,450,469,543,554],{"title":265,"path":266,"order":209,"children":267},"admin","\u002Fdocs\u002Fadmin",[268,272,284,292,296,300,304,308],{"title":269,"path":270,"order":223,"children":271},"Administering FlowFuse","\u002Fdocs\u002Fadmin\u002Fintroduction",[],{"title":273,"path":274,"order":209,"children":275},"Configuring Single Sign-On (SSO)","\u002Fdocs\u002Fadmin\u002Fsso",[276,280],{"title":277,"path":278,"order":209,"children":279},"LDAP SSO","\u002Fdocs\u002Fadmin\u002Fsso\u002Fldap",[],{"title":281,"path":282,"order":209,"children":283},"SAML SSO","\u002Fdocs\u002Fadmin\u002Fsso\u002Fsaml",[],{"title":285,"path":286,"order":209,"children":287},"hardening","\u002Fdocs\u002Fadmin\u002Fhardening",[288],{"title":289,"path":290,"order":209,"children":291},"Kubernetes Hardening","\u002Fdocs\u002Fadmin\u002Fhardening\u002Fkubernetes",[],{"title":293,"path":294,"order":209,"children":295},"Monitoring","\u002Fdocs\u002Fadmin\u002Fmonitoring",[],{"title":297,"path":298,"order":209,"children":299},"Observability","\u002Fdocs\u002Fadmin\u002Fobservability",[],{"title":301,"path":302,"order":209,"children":303},"Soft Launch Enablement","\u002Fdocs\u002Fadmin\u002Ffeature-flags",[],{"title":305,"path":306,"order":209,"children":307},"Telemetry","\u002Fdocs\u002Fadmin\u002Ftelemetry",[],{"title":309,"path":310,"order":209,"children":311},"User Management","\u002Fdocs\u002Fadmin\u002Fuser-management",[],{"title":313,"path":314,"order":209,"children":315},"cloud","\u002Fdocs\u002Fcloud",[316,320],{"title":317,"path":318,"order":223,"children":319},"Introduction","\u002Fdocs\u002Fcloud\u002Fintroduction",[],{"title":321,"path":322,"order":209,"children":323},"FlowFuse Cloud Billing","\u002Fdocs\u002Fcloud\u002Fbilling",[],{"title":325,"path":326,"order":209,"children":327},"contribute","\u002Fdocs\u002Fcontribute",[328,331,335,339,341,345,349,357,393,397],{"title":317,"path":329,"order":223,"children":330},"\u002Fdocs\u002Fcontribute\u002Fintroduction",[],{"title":332,"path":333,"order":209,"children":334},"Adding Template Settings","\u002Fdocs\u002Fcontribute\u002Fadding-template-settings",[],{"title":336,"path":337,"order":209,"children":338},"API Design","\u002Fdocs\u002Fcontribute\u002Fapi-design",[],{"title":211,"path":214,"order":209,"children":340},[],{"title":342,"path":343,"order":209,"children":344},"Database migrations","\u002Fdocs\u002Fcontribute\u002Fdb-migrations",[],{"title":346,"path":347,"order":209,"children":348},"FlowFuse Architecture","\u002Fdocs\u002Fcontribute\u002Farchitecture",[],{"title":350,"path":351,"order":209,"children":352},"Local Install","\u002Fdocs\u002Fcontribute\u002Flocal",[353],{"title":354,"path":355,"order":209,"children":356},"Local Stacks","\u002Fdocs\u002Fcontribute\u002Flocal\u002Fstacks",[],{"title":358,"path":359,"order":209,"children":360},"State Flows","\u002Fdocs\u002Fcontribute\u002Fworkflows",[361,365,369,373,377,381,385,389],{"title":362,"path":363,"order":209,"children":364},"Device Editor","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fdevice-editor",[],{"title":366,"path":367,"order":209,"children":368},"Instance states","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fproject-states",[],{"title":370,"path":371,"order":209,"children":372},"Invite External Users","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Finvite-external-user",[],{"title":374,"path":375,"order":209,"children":376},"Project Creation","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fproject-create",[],{"title":378,"path":379,"order":209,"children":380},"Reset Password Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fpassword-reset",[],{"title":382,"path":383,"order":209,"children":384},"Team creation Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fteam-create",[],{"title":386,"path":387,"order":209,"children":388},"User Login Flows","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Flogin",[],{"title":390,"path":391,"order":209,"children":392},"User Sign up Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fsignup",[],{"title":394,"path":395,"order":209,"children":396},"Team Broker","\u002Fdocs\u002Fcontribute\u002Fteam-broker",[],{"title":398,"path":399,"order":209,"children":400},"Working with Feature Flags","\u002Fdocs\u002Fcontribute\u002Ffeature-flags",[],{"title":402,"path":403,"order":209,"children":404},"device-agent","\u002Fdocs\u002Fdevice-agent",[405,409,412,416,420,425],{"title":406,"path":407,"order":223,"children":408},"FlowFuse Device Agent Introduction","\u002Fdocs\u002Fdevice-agent\u002Fintroduction",[],{"title":234,"path":410,"order":228,"children":411},"\u002Fdocs\u002Fdevice-agent\u002Fquickstart",[],{"title":413,"path":414,"order":201,"children":415},"Register your Remote Instance","\u002Fdocs\u002Fdevice-agent\u002Fregister",[],{"title":417,"path":418,"order":251,"children":419},"Running the Agent","\u002Fdocs\u002Fdevice-agent\u002Frunning",[],{"title":421,"path":422,"order":423,"children":424},"Deploying your Flows","\u002Fdocs\u002Fdevice-agent\u002Fdeploy",6,[],{"title":426,"path":427,"order":209,"children":428},"install","\u002Fdocs\u002Fdevice-agent\u002Finstall",[429,434,438,442,446],{"title":430,"path":431,"group":432,"order":223,"children":433},"Overview","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Foverview","DeviceAgentInstallation",[],{"title":435,"path":436,"group":432,"order":228,"children":437},"Device Agent Installer","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fdevice-agent-installer",[],{"title":439,"path":440,"group":432,"order":204,"children":441},"Docker Install","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fdocker",[],{"title":443,"path":444,"group":432,"order":201,"children":445},"Kubernetes Install","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fkubernetes",[],{"title":447,"path":448,"group":432,"order":251,"children":449},"Manual Install with NPM","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fmanual",[],{"title":451,"path":452,"order":209,"children":453},"hardware","\u002Fdocs\u002Fhardware",[454,457,461,465],{"title":430,"path":455,"order":223,"children":456},"\u002Fdocs\u002Fhardware\u002Fintroduction",[],{"title":458,"path":459,"order":228,"children":460},"ctrlX - Node-RED","\u002Fdocs\u002Fhardware\u002Fctrlx-node-red",[],{"title":462,"path":463,"order":204,"children":464},"ctrlX - Device Agent","\u002Fdocs\u002Fhardware\u002Fctrlx-device-agent",[],{"title":466,"path":467,"order":204,"children":468},"Raspberry Pi with Raspbian","\u002Fdocs\u002Fhardware\u002Fraspbian",[],{"title":426,"path":470,"order":209,"children":471},"\u002Fdocs\u002Finstall",[472,475,479,483,503,507,511,515],{"title":430,"path":473,"order":223,"children":474},"\u002Fdocs\u002Finstall\u002Fintroduction",[],{"title":476,"path":477,"order":209,"children":478},"Configuring FlowFuse","\u002Fdocs\u002Finstall\u002Fconfiguration",[],{"title":480,"path":481,"order":209,"children":482},"DNS Setup","\u002Fdocs\u002Finstall\u002Fdns-setup",[],{"title":484,"path":485,"order":209,"children":486},"Docker install","\u002Fdocs\u002Finstall\u002Fdocker",[487,491,495,499],{"title":488,"path":489,"order":209,"children":490},"Add Project Stacks on Docker","\u002Fdocs\u002Finstall\u002Fdocker\u002Fstacks",[],{"title":492,"path":493,"order":209,"children":494},"Docker Engine on Windows","\u002Fdocs\u002Finstall\u002Fdocker\u002Fwindows-docker-ce",[],{"title":496,"path":497,"order":209,"children":498},"Docker from AWS Market Place","\u002Fdocs\u002Finstall\u002Fdocker\u002Faws-marketplace",[],{"title":500,"path":501,"order":209,"children":502},"Docker on Digital Ocean","\u002Fdocs\u002Finstall\u002Fdocker\u002Fdigital-ocean",[],{"title":504,"path":505,"order":209,"children":506},"Email configuration","\u002Fdocs\u002Finstall\u002Femail-providers",[],{"title":508,"path":509,"order":209,"children":510},"First Run Setup","\u002Fdocs\u002Finstall\u002Ffirst-run",[],{"title":512,"path":513,"order":209,"children":514},"FlowFuse File Storage","\u002Fdocs\u002Finstall\u002Ffile-storage",[],{"title":516,"path":517,"order":209,"children":518},"Install FlowFuse on Kubernetes","\u002Fdocs\u002Finstall\u002Fkubernetes",[519,523,527,531,535,539],{"title":520,"path":521,"order":209,"children":522},"AWS EKS Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Faws",[],{"title":524,"path":525,"order":209,"children":526},"AWS EKS Installation with Terraform and Helm","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Faws-terraform",[],{"title":528,"path":529,"order":209,"children":530},"Digital Ocean Kubernetes Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fdigital-ocean",[],{"title":532,"path":533,"order":209,"children":534},"Ingress Controller Migration","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fingress-controller-migration",[],{"title":536,"path":537,"order":209,"children":538},"Kubernetes Project Stacks","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fstacks",[],{"title":540,"path":541,"order":209,"children":542},"OpenShift Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fopenshift",[],{"title":544,"path":545,"order":209,"children":546},"migration","\u002Fdocs\u002Fmigration",[547,550],{"title":317,"path":548,"order":223,"children":549},"\u002Fdocs\u002Fmigration\u002Fintroduction",[],{"title":551,"path":552,"order":209,"children":553},"Node-RED Tools plugin","\u002Fdocs\u002Fmigration\u002Fnode-red-tools",[],{"title":555,"path":556,"order":209,"children":557},"user","\u002Fdocs\u002Fuser",[558,562,566,570,574,579,583,587,591,595,599,603,615,619,623,627,631,635,639,643,647,651,655,659,663,667,670,674],{"title":559,"path":560,"order":223,"children":561},"Getting Started","\u002Fdocs\u002Fuser\u002Fintroduction",[],{"title":563,"path":564,"order":223,"children":565},"Static asset service","\u002Fdocs\u002Fuser\u002Fstatic-asset-service",[],{"title":567,"path":568,"order":228,"children":569},"Bill of Materials","\u002Fdocs\u002Fuser\u002Fbill-of-materials",[],{"title":571,"path":572,"order":228,"children":573},"FlowFuse Concepts","\u002Fdocs\u002Fuser\u002Fconcepts",[],{"title":575,"path":576,"order":577,"children":578},"Instance States","\u002Fdocs\u002Fuser\u002Finstance-states",10,[],{"title":580,"path":581,"order":209,"children":582},"Changing the Stack","\u002Fdocs\u002Fuser\u002Fchangestack",[],{"title":584,"path":585,"order":209,"children":586},"Custom Hostnames","\u002Fdocs\u002Fuser\u002Fcustom-hostnames",[],{"title":588,"path":589,"order":209,"children":590},"Custom Node Packages","\u002Fdocs\u002Fuser\u002Fcustom-npm-packages",[],{"title":592,"path":593,"order":209,"children":594},"Dashboards","\u002Fdocs\u002Fuser\u002Fdashboards",[],{"title":596,"path":597,"order":209,"children":598},"DevOps Pipelines","\u002Fdocs\u002Fuser\u002Fdevops-pipelines",[],{"title":600,"path":601,"order":209,"children":602},"Environment Variables","\u002Fdocs\u002Fuser\u002Fenvvar",[],{"title":604,"path":605,"order":209,"children":606},"FlowFuse Expert","\u002Fdocs\u002Fuser\u002Fexpert",[607,611],{"title":608,"path":609,"order":209,"children":610},"AI in Node-RED","\u002Fdocs\u002Fuser\u002Fexpert\u002Fnode-red-embedded-ai",[],{"title":612,"path":613,"order":209,"children":614},"Chat Interface","\u002Fdocs\u002Fuser\u002Fexpert\u002Fchat",[],{"title":616,"path":617,"order":209,"children":618},"FlowFuse File Nodes","\u002Fdocs\u002Fuser\u002Ffilenodes",[],{"title":620,"path":621,"order":209,"children":622},"FlowFuse MQTT Nodes","\u002Fdocs\u002Fuser\u002Fmqtt-nodes",[],{"title":624,"path":625,"order":209,"children":626},"FlowFuse Persistent Context","\u002Fdocs\u002Fuser\u002Fpersistent-context",[],{"title":628,"path":629,"order":209,"children":630},"FlowFuse Project Nodes","\u002Fdocs\u002Fuser\u002Fprojectnodes",[],{"title":632,"path":633,"order":209,"children":634},"FlowFuse Tables","\u002Fdocs\u002Fuser\u002Fff-tables",[],{"title":636,"path":637,"order":209,"children":638},"Groups","\u002Fdocs\u002Fuser\u002Fdevice-groups",[],{"title":640,"path":641,"order":209,"children":642},"High Availability mode","\u002Fdocs\u002Fuser\u002Fhigh-availability",[],{"title":644,"path":645,"order":209,"children":646},"HTTP Access Tokens","\u002Fdocs\u002Fuser\u002Fhttp-access-tokens",[],{"title":648,"path":649,"order":209,"children":650},"Instance Settings","\u002Fdocs\u002Fuser\u002Finstance-settings",[],{"title":652,"path":653,"order":209,"children":654},"Logging","\u002Fdocs\u002Fuser\u002Flogs",[],{"title":656,"path":657,"order":209,"children":658},"Role-Based Access Control","\u002Fdocs\u002Fuser\u002Frole-based-access-control",[],{"title":660,"path":661,"order":209,"children":662},"Shared Team Library","\u002Fdocs\u002Fuser\u002Fshared-library",[],{"title":664,"path":665,"order":209,"children":666},"Snapshots","\u002Fdocs\u002Fuser\u002Fsnapshots",[],{"title":394,"path":668,"order":209,"children":669},"\u002Fdocs\u002Fuser\u002Fteambroker",[],{"title":671,"path":672,"order":209,"children":673},"Teams","\u002Fdocs\u002Fuser\u002Fteam",[],{"title":675,"path":676,"order":209,"children":677},"User Settings","\u002Fdocs\u002Fuser\u002Fuser-settings",[],1786973309554]