# Technical Implementation Notes ## NVM Support (v5.0.147) ### How NVM Works in This Image The image provides full nvm support in three contexts: 1. **Dockerfile RUN commands**: Via `/usr/local/bin/bash-with-nvm` wrapper 2. **CI/CD workflow scripts**: Via /etc/bash.bashrc prepended configuration 3. **Interactive shells**: Via /etc/bash.bashrc standard loading ### Key Components #### 1. /etc/bash.bashrc (Prepended NVM Init) - NVM initialization is **prepended** to /etc/bash.bashrc - **Critical**: Placed BEFORE the `[ -z "$PS1" ] && return` line - This ensures nvm loads in both interactive AND non-interactive bash shells - Location: Lines 1-3 of /etc/bash.bashrc #### 2. /usr/local/bin/bash-with-nvm (Build-Time Wrapper) - Wrapper script that sources nvm before executing Dockerfile RUN commands - Used via `SHELL ["/usr/local/bin/bash-with-nvm"]` directive - Ensures nvm is available during `docker build` without manual sourcing #### 3. /usr/local/bin/docker-entrypoint.sh (Runtime Wrapper) - ENTRYPOINT that detects `bash -c` commands - Automatically injects `source /etc/bash.bashrc` for bash -c invocations - Passes through other commands unchanged - Critical for CI/CD workflow support #### 4. ENV PATH Fallback - Maintains `ENV PATH` pointing to default Node v20.12.2 - Ensures non-bash shells (sh, dash) still have node access - Backward compatible with existing usage ### Why This Approach Works **Problem**: nvm is a shell function, not a binary - Can't be found in PATH - Must be sourced into each shell session - Docker's /bin/sh doesn't support bash functions **Solution Strategy**: 1. Prepend nvm init to /etc/bash.bashrc (before early return) 2. Use wrapper for build-time (SHELL directive) 3. Use ENTRYPOINT for runtime (docker run / CI/CD) 4. Keep ENV PATH for fallback ### Version Persistence Limitation Each Dockerfile RUN command creates a new shell: ```dockerfile RUN nvm install 18 # Installs but doesn't persist RUN node --version # Shows v20.12.2 (ENV PATH) ``` **Workaround**: Chain commands or set default: ```dockerfile RUN nvm install 18 && nvm alias default 18 RUN node --version # Now shows v18.x.x ``` ### Testing Performed - ✅ Dockerfile RUN: `nvm install`, `nvm use`, version switching - ✅ Runtime bash -c: All nvm commands work - ✅ CI/CD workflows: Tested in .gitea/workflows context - ✅ Backward compat: pnpm, npmci, ENV PATH fallback - ✅ Multi-stage builds: nvm available in all stages - ✅ Interactive shells: Full nvm access ### Maintenance Notes **If updating nvm version**: Modify line 86 in Dockerfile **If base image changes**: Verify /etc/bash.bashrc structure still has early return pattern **If ENTRYPOINT conflicts**: Users can override with `--entrypoint` flag: ```bash docker run --entrypoint /bin/bash image -c "commands" ```