Compare commits

..

134 Commits

Author SHA1 Message Date
6935d292b4 v5.4.0
Some checks failed
Docker (tags) / security (push) Failing after 1s
Docker (tags) / test (push) Has been skipped
Docker (tags) / release (push) Has been skipped
Docker (tags) / metadata (push) Has been skipped
2026-02-06 14:00:03 +00:00
3420824d7b feat(ci): replace npmci with szci across CI and images; add szci preinstalled images and make tini the PID 1 init in Docker images 2026-02-06 14:00:03 +00:00
f3c2510a24 v5.3.0 2026-02-06 10:06:40 +00:00
c3847a970e feat(docker): add Chromium support for Puppeteer/Playwright and npm build/release scripts 2026-02-06 09:31:43 +00:00
2a7eb157b6 v5.2.0
Some checks failed
Docker (tags) / security (push) Successful in 24s
Docker (tags) / test (push) Successful in 30s
Docker (tags) / metadata (push) Successful in 3s
Docker (tags) / release (push) Failing after 40s
2026-02-06 08:51:12 +00:00
74c7bcd053 feat(ci): switch CI to use @git.zone/tsdocker and add tsdocker config and image tests 2026-02-06 08:51:12 +00:00
e61aeaad2d docs: Update documentation for modernization changes
- Update readme.hints.md with Ubuntu 24.04 upgrade notes, package changes,
  MongoDB 8.0 details, and corrected NVM/Node version references
- Update readme.md with Ubuntu 24.04 tag description and adjusted image sizes
2026-02-06 08:48:25 +00:00
e1ad8c2d83 feat(core): Modernize Ubuntu base, NVM, Node.js, and MongoDB
Ubuntu 24.04 upgrade:
- Upgrade base from ubuntu:20.04 to ubuntu:24.04
- Remove Python 2 (EOL since 2020), keep Python 3
- Replace deprecated packages for 24.04 compatibility:
  gconf-service/libgconf-2-4 removed, libgcc1 → libgcc-s1,
  libappindicator1 → libayatana-appindicator3-1,
  libasound2 → libasound2t64
- Add libgbm1 and libatk-bridge2.0-0 for Chrome/Puppeteer

NVM & Node.js:
- Upgrade NVM from v0.33.8 to v0.40.1
- Upgrade Node.js from v20.x to v24.13.0 LTS across all images

MongoDB:
- Upgrade from 4.4 to 8.0
- Use modern gpg keyring approach instead of deprecated apt-key
- Update repository from bionic to noble
2026-02-06 08:44:56 +00:00
9aed8b7b40 fix(tests): Add shebangs, set -e, and comprehensive checks to Ubuntu test scripts
- Rewrite test_latest.sh with real tests for NVM, Node.js, pnpm, Bun, Deno, and version switching
- Add #!/bin/bash shebang and set -e to test_stable.sh and test_npmci.sh
2026-02-06 08:44:32 +00:00
165712267c fix(ci): Correct misleading workflow name, remove duplicate tapbundle
- Fix docker_nottags.yaml name from "Docker (tags)" to "Docker (non-tag pushes)"
- Remove duplicate @push.rocks/tapbundle entry in fossglobal preinstalled Dockerfile
2026-02-06 08:44:23 +00:00
391b13bf57 fix(metadata): Remove vestigial tsconfig.json, clean up package.json
- Remove tsconfig.json (no TypeScript source exists in this project)
- Remove unused files array (package is private: true)
- Fix author from "Lossless GmbH" to "Task Venture Capital GmbH" to match LICENSE
2026-02-06 08:44:16 +00:00
cb455aa773 5.1.0
Some checks failed
Docker (tags) / metadata (push) Successful in 3s
Docker (tags) / security (push) Successful in 22s
Docker (tags) / test (push) Successful in 30s
Docker (tags) / release (push) Failing after 43s
2025-10-26 14:22:02 +00:00
9b87ba1acb feat(alpine-deno): Improve alpine deno image: switch to alpine:edge and use native Deno package, remove glibc workaround, update NVM/PATH, add local tooling settings and expanded README 2025-10-26 14:22:02 +00:00
83a07732db feat: Introduce multi-architecture Alpine Docker images with NVM, Bun, and Deno support 2025-10-26 14:00:20 +00:00
66fd354b95 feat(Dockerfile): Add installation of Bun and Deno for enhanced runtime support 2025-10-26 12:12:54 +00:00
bb8d623c95 refactor(nvm): Move wrapper scripts to image_support_files directory
Improved code organization and maintainability:
- Created image_support_files/ directory for Docker helper scripts
- Moved bash-with-nvm and docker-entrypoint.sh to support directory
- Added comprehensive README.md documenting each script's purpose
- Updated Dockerfile to COPY from organized directory structure

Benefits:
- Cleaner repository structure
- Scripts are now version-controlled files (not echo chains)
- Easier to read, modify, and maintain
- Self-documented with in-directory README

No functional changes - all nvm functionality remains identical.
2025-10-26 10:38:59 +00:00
3aea4a70ee docs(nvm): Document nvm usage in Dockerfiles and CI/CD workflows
- Add comprehensive NVM usage section to README
- Document Dockerfile RUN command usage
- Document CI/CD workflow integration
- Explain nvm vs npmci comparison
- Add technical implementation notes to readme.hints.md
- Update changelog with v5.0.147 feature details

Includes:
- Direct nvm usage examples for Dockerfiles
- CI/CD workflow YAML examples
- Version persistence behavior documentation
- Multi-version testing examples
- Technical architecture details
- Maintenance guidelines
2025-10-26 10:36:05 +00:00
c6ba400214 feat(nvm): Enable full nvm support in Docker builds and CI/CD workflows
- Add global nvm configuration in /etc/bash.bashrc (prepended before PS1 check)
- Create bash-with-nvm wrapper for Dockerfile RUN commands
- Add intelligent ENTRYPOINT for runtime nvm support
- Change default SHELL directive to use nvm wrapper
- nvm commands work directly in RUN without manual sourcing
- nvm commands work in CI/CD workflow bash -c scripts
- Maintain backward compatibility: npmci still available, ENV PATH preserved
- Non-bash shells fall back to ENV PATH (v20.12.2)
- Both interactive and non-interactive shells have full nvm access

Technical implementation:
- /etc/bash.bashrc: NVM init prepended before early return
- /usr/local/bin/bash-with-nvm: Build-time wrapper via SHELL directive
- /usr/local/bin/docker-entrypoint.sh: Runtime wrapper for bash -c detection
- ENV PATH fallback ensures non-bash compatibility

Tested:
- Dockerfile RUN: install, use, version switching
- Runtime bash -c: all nvm commands
- CI/CD workflows: .gitea context
- Backward compat: pnpm, npmci, ENV PATH
- Multi-stage builds, interactive shells
2025-10-26 10:35:42 +00:00
ab4275c430 5.0.146
All checks were successful
Docker (tags) / security (push) Successful in 38s
Docker (tags) / test (push) Successful in 55s
Docker (tags) / metadata (push) Successful in 6s
Docker (tags) / release (push) Successful in 14m46s
2024-11-17 20:24:00 +01:00
76c86e09c1 fix(Dockerfiles): Correct Docker image source host in various Dockerfiles 2024-11-17 20:24:00 +01:00
f2ab850e19 5.0.145
Some checks failed
Docker (tags) / security (push) Successful in 39s
Docker (tags) / test (push) Successful in 54s
Docker (tags) / metadata (push) Successful in 6s
Docker (tags) / release (push) Failing after 42s
2024-11-17 20:16:21 +01:00
29c707d79f fix(docs): Minor documentation updates without code changes. 2024-11-17 20:16:20 +01:00
5789c4eea6 5.0.144
Some checks failed
Docker (tags) / security (push) Successful in 36s
Docker (tags) / test (push) Successful in 54s
Docker (tags) / metadata (push) Successful in 6s
Docker (tags) / release (push) Failing after 15m41s
2024-11-17 07:57:21 +01:00
52369e55db fix(ci): Update Docker container source for workflow to new registry 2024-11-17 07:57:21 +01:00
13aadf4730 5.0.143
Some checks failed
Docker (tags) / security (push) Successful in 44s
Docker (tags) / test (push) Successful in 54s
Docker (tags) / metadata (push) Successful in 7s
Docker (tags) / release (push) Failing after 29s
2024-11-17 07:47:16 +01:00
41cf74c307 fix(core): No uncommitted changes 2024-11-17 07:47:16 +01:00
8e48786393 5.0.142
All checks were successful
Docker (tags) / security (push) Successful in 37s
Docker (tags) / test (push) Successful in 44s
Docker (tags) / metadata (push) Successful in 5s
Docker (tags) / release (push) Successful in 1m8s
2024-05-26 14:39:43 +02:00
a00d36cf95 fix(core): update 2024-05-26 14:39:42 +02:00
69ee21ed1b 5.0.141
Some checks failed
Docker (tags) / security (push) Failing after 0s
Docker (tags) / test (push) Has been skipped
Docker (tags) / release (push) Has been skipped
Docker (tags) / metadata (push) Has been skipped
2024-05-26 14:02:48 +02:00
39bd0ea990 fix(core): update 2024-05-26 14:02:47 +02:00
cfc7ef07cf 5.0.140
Some checks failed
Docker (tags) / security (push) Failing after 0s
Docker (tags) / test (push) Has been skipped
Docker (tags) / release (push) Has been skipped
Docker (tags) / metadata (push) Has been skipped
2024-05-26 14:01:44 +02:00
356dda054f fix(core): update 2024-05-26 14:01:43 +02:00
f0b993d9c0 5.0.139
All checks were successful
Docker (tags) / security (push) Successful in 37s
Docker (tags) / test (push) Successful in 45s
Docker (tags) / metadata (push) Successful in 5s
Docker (tags) / release (push) Successful in 7m16s
2024-05-26 13:15:30 +02:00
75d68d1f2b fix(core): update 2024-05-26 13:15:30 +02:00
e9f77f7042 5.0.138
All checks were successful
Docker (tags) / security (push) Successful in 38s
Docker (tags) / test (push) Successful in 44s
Docker (tags) / metadata (push) Successful in 5s
Docker (tags) / release (push) Successful in 2m16s
2024-05-26 11:34:41 +02:00
18e6b59ab1 5.0.137
All checks were successful
Docker (tags) / security (push) Successful in 38s
Docker (tags) / test (push) Successful in 46s
Docker (tags) / metadata (push) Successful in 5s
Docker (tags) / release (push) Successful in 7m9s
2024-05-26 11:04:58 +02:00
2c2685dbcb fix(core): update 2024-05-26 11:04:57 +02:00
592d71de80 5.0.136
Some checks failed
Docker (tags) / security (push) Successful in 28s
Docker (tags) / test (push) Successful in 47s
Docker (tags) / metadata (push) Successful in 5s
Docker (tags) / release (push) Failing after 59s
2024-05-26 00:15:01 +02:00
2702d68891 5.0.135
Some checks failed
Docker (tags) / security (push) Successful in 38s
Docker (tags) / test (push) Successful in 44s
Docker (tags) / metadata (push) Successful in 5s
Docker (tags) / release (push) Failing after 21s
2024-05-26 00:11:49 +02:00
a04530e50c fix(core): update 2024-05-26 00:11:49 +02:00
c3e2190907 5.0.134
Some checks failed
Docker (tags) / security (push) Successful in 27s
Docker (tags) / test (push) Successful in 43s
Docker (tags) / metadata (push) Successful in 5s
Docker (tags) / release (push) Failing after 27s
2024-05-24 15:53:37 +02:00
8d9767035d fix(core): update 2024-05-24 15:53:36 +02:00
5bbf3e20fb 5.0.133
Some checks failed
Docker (tags) / security (push) Successful in 36s
Docker (tags) / test (push) Successful in 43s
Docker (tags) / metadata (push) Successful in 5s
Docker (tags) / release (push) Failing after 59s
2024-05-24 15:53:20 +02:00
5266959d11 fix(core): update 2024-05-24 15:53:20 +02:00
ca92e81fae 5.0.132
Some checks failed
Docker (tags) / security (push) Successful in 37s
Docker (tags) / test (push) Successful in 47s
Docker (tags) / metadata (push) Successful in 5s
Docker (tags) / release (push) Failing after 59s
2024-05-24 13:15:38 +02:00
47a7b99e55 fix(core): update 2024-05-24 13:15:37 +02:00
f945921591 5.0.131
Some checks failed
Docker (tags) / security (push) Successful in 29s
Docker (tags) / test (push) Successful in 54s
Docker (tags) / metadata (push) Successful in 5s
Docker (tags) / release (push) Failing after 7m26s
2024-05-24 13:05:17 +02:00
c0aaf75f4f fix(core): update 2024-05-24 13:05:16 +02:00
5f64057cdb 5.0.130
Some checks failed
Docker (tags) / security (push) Successful in 33s
Docker (tags) / test (push) Successful in 47s
Docker (tags) / metadata (push) Successful in 5s
Docker (tags) / release (push) Failing after 21s
2024-05-24 13:02:38 +02:00
d84919c3e6 fix(core): update 2024-05-24 13:02:37 +02:00
1db9b7978a 5.0.129
Some checks failed
Docker (tags) / security (push) Successful in 26s
Docker (tags) / test (push) Successful in 44s
Docker (tags) / metadata (push) Successful in 5s
Docker (tags) / release (push) Failing after 23s
2024-05-24 12:59:19 +02:00
ba19c565f6 fix(core): update 2024-05-24 12:59:19 +02:00
bcdd4d2acb 5.0.128
Some checks failed
Docker (tags) / security (push) Successful in 27s
Docker (tags) / test (push) Successful in 44s
Docker (tags) / metadata (push) Successful in 5s
Docker (tags) / release (push) Failing after 26s
2024-05-24 12:59:00 +02:00
662b888a35 fix(core): update 2024-05-24 12:58:59 +02:00
004ce39822 5.0.127
Some checks failed
Docker (tags) / security (push) Failing after 22s
Docker (tags) / test (push) Has been skipped
Docker (tags) / release (push) Has been skipped
Docker (tags) / metadata (push) Has been skipped
2024-05-24 12:57:16 +02:00
c1fb329671 fix(core): update 2024-05-24 12:57:15 +02:00
c2813373aa 5.0.126 2024-05-23 21:59:57 +02:00
617fa0f082 fix(core): update 2024-05-23 21:59:56 +02:00
1a6c1fcdf3 5.0.125 2024-05-23 21:54:51 +02:00
5f5f24d07d fix(core): update 2024-05-23 21:54:51 +02:00
2973032ead 5.0.124 2024-05-23 21:48:25 +02:00
05f2b58bdf 5.0.123 2024-05-17 20:24:59 +02:00
2c30a475a0 fix(core): update 2024-05-17 20:24:58 +02:00
944d2b4407 5.0.122 2024-05-16 16:35:19 +02:00
2a4cd64634 fix(core): update 2024-05-16 16:35:19 +02:00
0eb5bb0723 5.0.121 2024-05-16 16:25:50 +02:00
fefd97be8d fix(core): update 2024-05-16 16:25:49 +02:00
2b65b6b1fe 5.0.120 2024-05-16 16:24:33 +02:00
d76ea8564a fix(core): update 2024-05-16 16:24:33 +02:00
f476d6c897 5.0.119 2024-05-16 14:59:21 +02:00
7a7aafec13 fix(core): update 2024-05-16 14:59:20 +02:00
4184c17f2e 5.0.118 2024-05-16 14:29:32 +02:00
af4ceea6d0 fix(core): update 2024-05-16 14:29:31 +02:00
53962dc4c4 5.0.117 2024-05-16 14:13:16 +02:00
1687273fd2 fix(core): update 2024-05-16 14:13:15 +02:00
d8bdab5b8d 5.0.116 2024-05-16 14:06:03 +02:00
7a6f2f319e fix(core): update 2024-05-16 14:06:03 +02:00
5160ed1348 update description 2024-05-14 23:09:32 +02:00
b5e8ac3b59 5.0.115 2024-04-23 08:57:55 +02:00
bfb1b80180 5.0.114 2024-04-23 08:52:16 +02:00
3e0006f243 fix(core): update 2024-04-23 08:52:15 +02:00
60e9a2a207 5.0.113 2023-04-02 13:22:12 +02:00
7422d9c146 fix(core): update 2023-04-02 13:22:11 +02:00
5821c9f6e6 5.0.112 2023-04-02 12:56:24 +02:00
28746e0349 fix(core): update 2023-04-02 12:56:23 +02:00
65cae1e013 5.0.111 2023-03-29 12:53:57 +02:00
39f8227d1e fix(core): update 2023-03-29 12:53:57 +02:00
7831edc5f0 5.0.110 2023-03-29 12:43:00 +02:00
66699e8b07 fix(core): update 2023-03-29 12:42:59 +02:00
d7dd21bd69 5.0.109 2023-03-29 12:31:14 +02:00
ad2fc45c8b fix(core): update 2023-03-29 12:31:14 +02:00
02cdabd87b 5.0.108 2023-03-29 12:23:59 +02:00
e704131949 fix(core): update 2023-03-29 12:23:58 +02:00
c4b79e9d40 5.0.107 2023-03-29 12:13:25 +02:00
df97e0f010 fix(core): update 2023-03-29 12:13:24 +02:00
1a7aa7b178 5.0.106 2023-03-29 12:03:58 +02:00
b1c1efce87 fix(core): update 2023-03-29 12:03:57 +02:00
c399621989 5.0.105 2023-03-29 11:50:44 +02:00
e81806e9cc fix(core): update 2023-03-29 11:50:43 +02:00
b7961e0cf4 5.0.104 2023-03-29 11:37:06 +02:00
2319975b25 fix(core): update 2023-03-29 11:37:05 +02:00
c070b80cad 5.0.103 2022-12-17 15:41:48 +01:00
aaace28106 fix(core): update 2022-12-17 15:41:47 +01:00
7c4a71cd4c 5.0.102 2022-12-16 18:37:13 +01:00
1c0837c509 fix(core): update 2022-12-16 18:37:13 +01:00
1912e3c727 5.0.101 2022-10-21 12:01:08 +02:00
e758a35e0a fix(core): update 2022-10-21 12:01:08 +02:00
5a3c7369d9 5.0.100 2022-10-20 14:01:16 +02:00
8b91eafe26 fix(core): update 2022-10-20 14:01:16 +02:00
3ce538e94f 5.0.99 2022-10-20 13:56:29 +02:00
00f0fae876 fix(core): update 2022-10-20 13:56:29 +02:00
ebb82a445c 5.0.98 2022-10-20 13:48:44 +02:00
7ec5a147c9 fix(core): update 2022-10-20 13:48:44 +02:00
385780e50c 5.0.97 2022-10-19 01:04:27 +02:00
b894a361bd fix(core): update 2022-10-19 01:04:27 +02:00
f0747237cf 5.0.96 2022-10-19 00:38:05 +02:00
89ba2f5a9f fix(core): update 2022-10-19 00:38:05 +02:00
c295ad18be 5.0.95 2022-10-19 00:31:44 +02:00
afad2c3654 fix(core): update 2022-10-19 00:31:43 +02:00
409b0c60a1 5.0.94 2022-10-18 23:35:13 +02:00
feb57f1d36 fix(core): update 2022-10-18 23:35:13 +02:00
80f0a0d9dc 5.0.93 2022-10-18 23:23:39 +02:00
c2ba244375 fix(core): update 2022-10-18 23:23:38 +02:00
f859d910b6 5.0.92 2022-10-17 13:08:07 +02:00
bc71510cd1 fix(core): update 2022-10-17 13:08:06 +02:00
181b3643b1 5.0.91 2022-10-15 10:32:31 +02:00
85bee13ba9 fix(core): update 2022-10-15 10:32:31 +02:00
74c60c8d4f 5.0.90 2022-10-12 17:25:22 +02:00
0c5f20ed36 5.0.89 2022-10-12 17:24:48 +02:00
4066098153 fix(core): update 2022-10-12 17:24:48 +02:00
a9fcf3c64e 5.0.88 2022-10-12 16:33:03 +02:00
03cdeb1cd4 fix(core): update 2022-10-12 16:33:02 +02:00
d4cf1b5bc7 5.0.87 2022-10-11 10:42:42 +02:00
5da58d1f18 fix(core): update 2022-10-11 10:42:42 +02:00
35 changed files with 1527 additions and 225 deletions

View File

@@ -0,0 +1,71 @@
name: Docker (non-tag pushes)
on:
push:
tags-ignore:
- '**'
env:
IMAGE: registry.gitlab.com/hosttoday/ht-docker-node:szci
NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@gitea.lossless.digital/${{gitea.repository}}.git
NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}}
NPMCI_TOKEN_NPM2: ${{secrets.NPMCI_TOKEN_NPM2}}
NPMCI_GIT_GITHUBTOKEN: ${{secrets.NPMCI_GIT_GITHUBTOKEN}}
NPMCI_LOGIN_DOCKER_GITEA: ${{ github.server_url }}|${{ gitea.repository_owner }}|${{ secrets.GITEA_TOKEN }}
NPMCI_LOGIN_DOCKER_DOCKERREGISTRY: ${{ secrets.NPMCI_LOGIN_DOCKER_DOCKERREGISTRY }}
jobs:
security:
runs-on: ubuntu-latest
container:
image: ${{ env.IMAGE }}
continue-on-error: true
steps:
- uses: actions/checkout@v3
- name: Install pnpm and szci
run: |
pnpm install -g pnpm
pnpm install -g @ship.zone/szci
szci npm prepare
- name: Audit production dependencies
run: |
szci command npm config set registry https://registry.npmjs.org
szci command pnpm audit --audit-level=high --prod
continue-on-error: true
- name: Audit development dependencies
run: |
szci command npm config set registry https://registry.npmjs.org
szci command pnpm audit --audit-level=high --dev
continue-on-error: true
test:
needs: security
runs-on: ubuntu-latest
container:
image: ${{ env.IMAGE }}
steps:
- uses: actions/checkout@v3
- name: Prepare
run: |
pnpm install -g pnpm
pnpm install -g @ship.zone/szci
szci npm prepare
- name: Test stable
run: |
szci node install stable
szci npm install
szci npm test
- name: Test build
run: |
szci npm prepare
szci node install stable
szci npm install
szci command npm run build

View File

@@ -0,0 +1,113 @@
name: Docker (tags)
on:
push:
tags:
- '*'
env:
IMAGE: code.foss.global/host.today/ht-docker-node:szci
NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@gitea.lossless.digital/${{gitea.repository}}.git
# NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}}
# NPMCI_TOKEN_NPM2: ${{secrets.NPMCI_TOKEN_NPM2}}
# NPMCI_GIT_GITHUBTOKEN: ${{secrets.NPMCI_GIT_GITHUBTOKEN}}
# NPMCI_LOGIN_DOCKER_GITEA: ${{ github.server_url }}|${{ gitea.repository_owner }}|${{ secrets.GITEA_TOKEN }}
NPMCI_LOGIN_DOCKER_DOCKERREGISTRY: ${{ secrets.NPMCI_LOGIN_DOCKER_DOCKERREGISTRY }}
jobs:
security:
runs-on: ubuntu-latest
container:
image: ${{ env.IMAGE }}
continue-on-error: true
steps:
- uses: actions/checkout@v3
- name: Prepare
run: |
pnpm install -g pnpm
pnpm install -g @ship.zone/szci
szci npm prepare
- name: Audit production dependencies
run: |
szci command npm config set registry https://registry.npmjs.org
szci command pnpm audit --audit-level=high --prod
continue-on-error: true
- name: Audit development dependencies
run: |
szci command npm config set registry https://registry.npmjs.org
szci command pnpm audit --audit-level=high --dev
continue-on-error: true
test:
needs: security
runs-on: ubuntu-latest
container:
image: ${{ env.IMAGE }}
steps:
- uses: actions/checkout@v3
- name: Prepare
run: |
pnpm install -g pnpm
pnpm install -g @ship.zone/szci
szci npm prepare
- name: Test stable
run: |
szci node install stable
szci npm install
szci npm test
- name: Test build
run: |
szci node install stable
szci npm install
szci command npm run build
release:
needs: test
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
runs-on: ubuntu-latest
container:
image: code.foss.global/host.today/ht-docker-dbase:szci
steps:
- uses: actions/checkout@v3
- name: Prepare
run: |
pnpm install -g pnpm
pnpm install -g @git.zone/tsdocker@latest
- name: Login to registries
run: tsdocker login
- name: List discovered Dockerfiles
run: tsdocker list
- name: Build all images
run: tsdocker build
- name: Test images
run: tsdocker test
- name: Push to code.foss.global
run: tsdocker push code.foss.global
metadata:
needs: test
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
runs-on: ubuntu-latest
container:
image: ${{ env.IMAGE }}
steps:
- uses: actions/checkout@v3
- name: Trigger
run: szci trigger

View File

@@ -1,52 +0,0 @@
# gitzone ci_docker
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
cache:
paths:
- .npmci-cache/
key: "$CI_BUILD_STAGE"
before_script:
- npmci npm prepare
stages:
- test
- release
- trigger
- pages
testStable:
stage: test
script:
- npmci node install stable
- npmci npm install
- npmci npm test
coverage: /\d+.?\d+?\%\s*coverage/
tags:
- docker
release:
image: registry.gitlab.com/hosttoday/ht-docker-dbase:npmci
services:
- docker:stable-dind
stage: release
script:
- npmci node install lts
- npmci docker login
- npmci docker build
- npmci docker test
- npmci docker push registry.gitlab.com
only:
- tags
tags:
- docker
- priv
trigger:
stage: trigger
script:
- npmci trigger
only:
- tags
tags:
- docker

View File

@@ -1,9 +1,13 @@
FROM ubuntu:20.04
LABEL author="Lossless GmbH <hello@lossless.com>"
FROM ubuntu:24.04
LABEL author="Task Venture Capital GmbH <hello@task.vc>"
WORKDIR /workspace
# important environment variables
ENV NODE_VERSION_LTS="16.16.0" NODE_VERSION_STABLE="18.7.0" NVM_DIR="/usr/local/nvm"
# important environment variables
ENV NODE_VERSION_LTS="24.13.0" NODE_VERSION_STABLE="24.13.0" NVM_DIR="/usr/local/nvm"
# Chromium paths for Puppeteer/Playwright compatibility
ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser
ENV CHROME_BIN=/usr/bin/chromium-browser
# Set debconf to run non-interactively and install packages
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections \
@@ -22,23 +26,23 @@ RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selectio
git \
make \
openssl \
python \
python3 \
rsync \
ssh \
wget \
unzip \
# puppeteer
gconf-service \
libasound2 \
libasound2t64 \
libatk1.0-0 \
libatk-bridge2.0-0 \
libc6 \
libcairo2 \
libcups2 \
libdbus-1-3 \
libexpat1 \
libfontconfig1 \
libgcc1 \
libgconf-2-4 \
libgbm1 \
libgcc-s1 \
libgdk-pixbuf2.0-0 \
libglib2.0-0 \
libgtk-3-0 \
@@ -61,25 +65,77 @@ RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selectio
libxtst6 \
ca-certificates \
fonts-liberation \
libappindicator1 \
libayatana-appindicator3-1 \
libnss3 \
lsb-release \
xdg-utils \
# network
iputils-ping \
dnsutils \
# init
tini \
# chrome
&& wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb \
&& apt install -y -q --no-install-recommends ./google-chrome-stable_current_amd64.deb \
# chromium (multi-arch compatible - works on both amd64 and arm64)
&& apt-get install -y -q --no-install-recommends chromium-browser \
# mongodb
&& curl -fsSL https://www.mongodb.org/static/pgp/server-4.4.asc | apt-key add - \
&& echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.4 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-4.4.list \
# mongodb 8.0
&& curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | \
gpg --dearmor -o /usr/share/keyrings/mongodb-server-8.0.gpg \
&& echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu noble/mongodb-org/8.0 multiverse" | \
tee /etc/apt/sources.list.d/mongodb-org-8.0.list \
&& apt-get update \
&& apt-get install -y -q --no-install-recommends \
mongodb-org \
&& apt-get install -y -q --no-install-recommends mongodb-org \
&& apt-get clean \
&& rm -r /var/lib/apt/lists/*
# Install nvm with node and npm
RUN curl https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
RUN curl -fsSL https://get.pnpm.io/install.sh | sh - \
&& pnpm setup
RUN mkdir -p $NVM_DIR && curl https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
# Make nvm available globally in all bash shells (interactive + non-interactive)
# IMPORTANT: Prepend to bashrc, before the "[ -z "$PS1" ] && return" line
RUN printf '%s\n%s\n%s\n\n%s\n' \
'export NVM_DIR="/usr/local/nvm"' \
'[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"' \
'[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion"' \
"$(cat /etc/bash.bashrc)" > /etc/bash.bashrc
# Copy nvm wrapper scripts from support directory
COPY image_support_files/bash-with-nvm /usr/local/bin/bash-with-nvm
COPY image_support_files/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
RUN chmod +x /usr/local/bin/bash-with-nvm /usr/local/bin/docker-entrypoint.sh
# Use wrapper for RUN commands to enable nvm
SHELL ["/usr/local/bin/bash-with-nvm"]
# Enable nvm for runtime bash commands (CI/CD workflows)
ENV BASH_ENV=/etc/bash.bashrc
# prepare pnpm
ENV PNPM_HOME="/root/.local/share/pnpm/pnpm"
RUN mkdir -p ${PNPM_HOME}
ENV PATH="$PNPM_HOME:$PATH"
# Now nvm is available directly without sourcing
RUN nvm install $NODE_VERSION_STABLE \
&& nvm alias default $NODE_VERSION_STABLE \
&& nvm use default \
&& curl -fsSL https://get.pnpm.io/install.sh | bash - \
&& pnpm -v \
&& pnpm config set unsafe-perm true
ENV NODE_PATH $NVM_DIR/v$NODE_VERSION_STABLE/lib/node_modules
ENV PATH $NVM_DIR/versions/node/v$NODE_VERSION_STABLE/bin:$PATH
# Install Bun
RUN curl -fsSL https://bun.sh/install | bash
ENV BUN_INSTALL="/root/.bun"
ENV PATH="$BUN_INSTALL/bin:$PATH"
# Install Deno
RUN curl -fsSL https://deno.land/install.sh | sh
ENV DENO_INSTALL="/root/.deno"
ENV PATH="$DENO_INSTALL/bin:$PATH"
# Set entrypoint to make nvm available in all runtime contexts
ENTRYPOINT ["/usr/bin/tini", "--", "/usr/local/bin/docker-entrypoint.sh"]
CMD ["bash"]

View File

@@ -1,10 +0,0 @@
FROM node:18.7.0-alpine
LABEL author="Lossless GmbH <hello@lossless.com>"
RUN apk update && apk add bash libc6-compat alpine-sdk
ENV PYTHONUNBUFFERED=1
RUN apk add --update --no-cache python3 && ln -sf python3 /usr/bin/python
RUN python3 -m ensurepip
RUN pip3 install --no-cache --upgrade pip setuptools
RUN curl -fsSL "https://github.com/pnpm/pnpm/releases/latest/download/pnpm-linuxstatic-x64" -o /bin/pnpm; chmod +x /bin/pnpm;
ENV NODE_OPTIONS="--max_old_space_size=1000"

59
Dockerfile_alpine-bun Normal file
View File

@@ -0,0 +1,59 @@
FROM alpine:latest
LABEL author="Task Venture Capital GmbH <hello@task.vc>"
WORKDIR /workspace
# Important environment variables
ENV NODE_VERSION_LTS="24.13.0" \
NVM_DIR="/usr/local/nvm" \
BUN_INSTALL="/root/.bun" \
NVM_NODEJS_ORG_MIRROR="https://unofficial-builds.nodejs.org/download/release"
# Install required packages for NVM and Node.js
RUN apk add --no-cache \
bash \
curl \
git \
ca-certificates \
unzip \
libstdc++ \
tini
# Install NVM (latest version for better Alpine/musl support)
RUN mkdir -p $NVM_DIR && curl https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
# Make nvm available globally in all bash shells (interactive + non-interactive)
# IMPORTANT: Create /etc/bash.bashrc with nvm initialization
RUN printf '%s\n%s\n%s\n' \
'export NVM_DIR="/usr/local/nvm"' \
'[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"' \
'[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion"' \
> /etc/bash.bashrc
# Copy nvm wrapper scripts from support directory
COPY image_support_files/bash-with-nvm /usr/local/bin/bash-with-nvm
COPY image_support_files/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
RUN chmod +x /usr/local/bin/bash-with-nvm /usr/local/bin/docker-entrypoint.sh
# Use wrapper for RUN commands to enable nvm
SHELL ["/usr/local/bin/bash-with-nvm"]
# Enable nvm for runtime bash commands (CI/CD workflows)
ENV BASH_ENV=/etc/bash.bashrc
# Install Node.js LTS via NVM and Bun
# TARGETARCH fix: QEMU buildx can report wrong arch via uname -m
ARG TARGETARCH
RUN NVM_MUSL_ARCH=$([ "$TARGETARCH" = "arm64" ] && echo "arm64-musl" || echo "x64-musl") \
&& nvm_get_arch() { echo "$NVM_MUSL_ARCH"; } \
&& nvm install $NODE_VERSION_LTS \
&& nvm alias default $NODE_VERSION_LTS \
&& nvm use default \
&& curl -fsSL https://bun.sh/install | bash
ENV PATH="$BUN_INSTALL/bin:$NVM_DIR/versions/node/v$NODE_VERSION_LTS/bin:$PATH"
ENV NODE_PATH=$NVM_DIR/v$NODE_VERSION_LTS/lib/node_modules
# Set entrypoint to make nvm available in all runtime contexts
ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/docker-entrypoint.sh"]
CMD ["bash"]

59
Dockerfile_alpine-deno Normal file
View File

@@ -0,0 +1,59 @@
FROM alpine:edge
LABEL author="Task Venture Capital GmbH <hello@task.vc>"
WORKDIR /workspace
# Important environment variables
ENV NODE_VERSION_LTS="24.13.0" \
NVM_DIR="/usr/local/nvm" \
NVM_NODEJS_ORG_MIRROR="https://unofficial-builds.nodejs.org/download/release"
# Install required packages for NVM and Node.js
# Install Deno from Alpine community repository (native musl build)
RUN apk add --no-cache \
bash \
curl \
git \
ca-certificates \
unzip \
libstdc++ \
tini \
deno
# Install NVM (latest version for better Alpine/musl support)
RUN mkdir -p $NVM_DIR && curl https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
# Make nvm available globally in all bash shells (interactive + non-interactive)
# IMPORTANT: Create /etc/bash.bashrc with nvm initialization
RUN printf '%s\n%s\n%s\n' \
'export NVM_DIR="/usr/local/nvm"' \
'[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"' \
'[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion"' \
> /etc/bash.bashrc
# Copy nvm wrapper scripts from support directory
COPY image_support_files/bash-with-nvm /usr/local/bin/bash-with-nvm
COPY image_support_files/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
RUN chmod +x /usr/local/bin/bash-with-nvm /usr/local/bin/docker-entrypoint.sh
# Use wrapper for RUN commands to enable nvm
SHELL ["/usr/local/bin/bash-with-nvm"]
# Enable nvm for runtime bash commands (CI/CD workflows)
ENV BASH_ENV=/etc/bash.bashrc
# Install Node.js LTS via NVM (Deno already installed from Alpine repos)
# TARGETARCH fix: QEMU buildx can report wrong arch via uname -m
ARG TARGETARCH
RUN NVM_MUSL_ARCH=$([ "$TARGETARCH" = "arm64" ] && echo "arm64-musl" || echo "x64-musl") \
&& nvm_get_arch() { echo "$NVM_MUSL_ARCH"; } \
&& nvm install $NODE_VERSION_LTS \
&& nvm alias default $NODE_VERSION_LTS \
&& nvm use default
ENV PATH="$NVM_DIR/versions/node/v$NODE_VERSION_LTS/bin:$PATH"
ENV NODE_PATH=$NVM_DIR/v$NODE_VERSION_LTS/lib/node_modules
# Set entrypoint to make nvm available in all runtime contexts
ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/docker-entrypoint.sh"]
CMD ["bash"]

74
Dockerfile_alpine-node Normal file
View File

@@ -0,0 +1,74 @@
FROM alpine:latest
LABEL author="Task Venture Capital GmbH <hello@task.vc>"
WORKDIR /workspace
# Important environment variables
ENV NODE_VERSION_LTS="24.13.0" \
NVM_DIR="/usr/local/nvm" \
PNPM_HOME="/root/.local/share/pnpm" \
NVM_NODEJS_ORG_MIRROR="https://unofficial-builds.nodejs.org/download/release"
# Install required packages for NVM and Node.js
RUN apk add --no-cache \
bash \
curl \
git \
build-base \
python3 \
linux-headers \
ca-certificates \
wget \
unzip \
iputils \
bind-tools \
libstdc++ \
tini
# Install NVM (latest version for better Alpine/musl support)
RUN mkdir -p $NVM_DIR && curl https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
# Make nvm available globally in all bash shells (interactive + non-interactive)
# IMPORTANT: Create /etc/bash.bashrc with nvm initialization
RUN printf '%s\n%s\n%s\n' \
'export NVM_DIR="/usr/local/nvm"' \
'[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"' \
'[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion"' \
> /etc/bash.bashrc
# Copy nvm wrapper scripts from support directory
COPY image_support_files/bash-with-nvm /usr/local/bin/bash-with-nvm
COPY image_support_files/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
RUN chmod +x /usr/local/bin/bash-with-nvm /usr/local/bin/docker-entrypoint.sh
# Use wrapper for RUN commands to enable nvm
SHELL ["/usr/local/bin/bash-with-nvm"]
# Enable nvm for runtime bash commands (CI/CD workflows)
ENV BASH_ENV=/etc/bash.bashrc
# Prepare pnpm directory
RUN mkdir -p ${PNPM_HOME}
ENV PATH="$PNPM_HOME:$PATH"
# Install Node.js LTS via NVM and pnpm
# Use musl-specific builds from unofficial-builds for Alpine compatibility
# TARGETARCH fix: QEMU buildx can report wrong arch via uname -m, causing NVM
# to download x64 binaries on arm64. We create a temporary uname wrapper to
# ensure the correct architecture binary is downloaded.
ARG TARGETARCH
RUN NVM_MUSL_ARCH=$([ "$TARGETARCH" = "arm64" ] && echo "arm64-musl" || echo "x64-musl") \
&& nvm_get_arch() { echo "$NVM_MUSL_ARCH"; } \
&& nvm install $NODE_VERSION_LTS \
&& nvm alias default $NODE_VERSION_LTS \
&& nvm use default \
&& npm install -g pnpm \
&& pnpm -v \
&& pnpm config set unsafe-perm true
ENV NODE_PATH=$NVM_DIR/v$NODE_VERSION_LTS/lib/node_modules
ENV PATH=$NVM_DIR/versions/node/v$NODE_VERSION_LTS/bin:$PATH
# Set entrypoint to make nvm available in all runtime contexts
ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/docker-entrypoint.sh"]
CMD ["bash"]

10
Dockerfile_alpine-szci Normal file
View File

@@ -0,0 +1,10 @@
FROM host.today/ht-docker-node:alpine-node
RUN apk update && apk add bash libc6-compat alpine-sdk
ENV PYTHONUNBUFFERED=1
RUN apk add --update --no-cache python3 && ln -sf python3 /usr/bin/python
RUN python3 -m ensurepip
RUN pip3 install --no-cache --upgrade pip setuptools
RUN apk add --update alpine-sdk && \
apk add libffi-dev openssl-dev && \
apk add python3-dev && \
pnpm install -g @ship.zone/szci node-gyp

View File

@@ -0,0 +1,12 @@
FROM host.today/ht-docker-node:szci
RUN npm install -g \
@git.zone/tsrun \
@git.zone/tstest \
@push.rocks/qenv \
@push.rocks/smartfile \
@push.rocks/smartpath \
@push.rocks/smartshell \
@push.rocks/tapbundle \
axios \
@push.rocks/smartdelay \
@push.rocks/smartjson

View File

@@ -1,12 +0,0 @@
FROM hosttoday/ht-docker-node:stable as stage1
LABEL author="Lossless GmbH <hello@lossless.com>"
RUN apt-get update && apt-get install -y --no-install-recommends qemu-user-static binfmt-support
# the following lines need to be run on a system that supports both architectures
# update-binfmts --enable qemu-arm \
# && update-binfmts --display qemu-arm \
# && mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc \
# && echo ':arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm-static:' > /proc/sys/fs/binfmt_misc/register
FROM arm32v7/node:lts-jessie as stage2
COPY --from=stage1 /usr/bin/qemu-arm-static /usr/bin/qemu-arm-static

View File

@@ -1,13 +1,8 @@
FROM hosttoday/ht-docker-node:latest
LABEL author="Lossless GmbH <hello@lossless.com>"
FROM host.today/ht-docker-node:latest
LABEL author="Task Venture Capital GmbH <hello@task.vc>"
RUN bash -c "source $NVM_DIR/nvm.sh \
&& nvm install $NODE_VERSION_LTS \
&& nvm alias default $NODE_VERSION_LTS \
&& nvm use default \
&& npm config set unsafe-perm true \
&& npm install -g agentkeepalive \
&& npm install -g npm"
&& nvm install $NODE_VERSION_LTS"
ENV NODE_PATH $NVM_DIR/v$NODE_VERSION_LTS/lib/node_modules
ENV PATH $NVM_DIR/versions/node/v$NODE_VERSION_LTS/bin:$PATH

View File

@@ -1,4 +0,0 @@
FROM hosttoday/ht-docker-node:stable
LABEL author="Lossless GmbH <hello@lossless.com>"
RUN pnpm install -g @shipzone/npmci

View File

@@ -1,13 +0,0 @@
FROM hosttoday/ht-docker-node:latest
LABEL author="Lossless GmbH <hello@lossless.com>"
RUN bash -c "source $NVM_DIR/nvm.sh \
&& nvm install $NODE_VERSION_STABLE \
&& nvm alias default $NODE_VERSION_STABLE \
&& nvm use default \
&& npm config set unsafe-perm true \
&& npm install -g agentkeepalive \
&& npm install -g npm"
ENV NODE_PATH $NVM_DIR/v$NODE_VERSION_STABLE/lib/node_modules
ENV PATH $NVM_DIR/versions/node/v$NODE_VERSION_STABLE/bin:$PATH

View File

@@ -1,6 +0,0 @@
FROM hosttoday/ht-docker-node:stable
# Add Tini
ENV TINI_VERSION v0.19.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
RUN chmod +x /tini
ENTRYPOINT ["/tini", "--"]

4
Dockerfile_szci Normal file
View File

@@ -0,0 +1,4 @@
FROM host.today/ht-docker-node:latest
LABEL author="Task Venture Capital GmbH <hello@task.vc>"
RUN pnpm install -g @ship.zone/szci

View File

@@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) 2016 Lossless GmbH
Copyright (c) 2016 Task Venture Capital GmbH
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

159
changelog.md Normal file
View File

@@ -0,0 +1,159 @@
# Changelog
## 2026-02-06 - 5.4.0 - feat(ci)
replace npmci with szci across CI and images; add szci preinstalled images and make tini the PID 1 init in Docker images
- Replace @ship.zone/npmci with @ship.zone/szci in Gitea CI workflows (.gitea/workflows/docker_nottags.yaml, docker_tags.yaml) and update commands to use szci
- Add szci-specific Dockerfiles (Dockerfile_szci, Dockerfile_alpine-szci) and tests (test/test_szci.sh); remove npmci-specific files
- Install and use tini as PID 1 in multiple Dockerfiles and switch ENTRYPOINT to run tini for proper signal forwarding and zombie reaping
- Update metadata/manifest files (package.json, npmextra.json, readme.*, Dockerfile base tags) to reference szci and document the inclusion of tini
## 2026-02-06 - 5.3.0 - feat(docker)
add Chromium support for Puppeteer/Playwright and npm build/release scripts
- Add PUPPETEER_EXECUTABLE_PATH and CHROME_BIN env vars pointing to /usr/bin/chromium-browser for Puppeteer/Playwright compatibility
- Replace Google Chrome .deb download with apt-get install chromium-browser for multi-arch (amd64/arm64) compatibility
- Add npm scripts: 'build' -> 'tsdocker build' and 'release' -> 'tsdocker push' in package.json
## 2026-02-06 - 5.2.0 - feat(ci)
switch CI to use @git.zone/tsdocker and add tsdocker config and image tests
- Replace @ship.zone/npmci with @git.zone/tsdocker in CI workflow and use tsdocker commands: login, list, build, test, push
- Add npmextra.json configuration for @git.zone/tsdocker (registries, registryRepoMap, platforms, push/testDir)
- Add Dockerfile_alpine-npmci and per-image test scripts under test/ (alpine-bun, alpine-deno, alpine-node)
- Remove legacy Alpine Dockerfiles and legacy build/test scripts (Dockerfile_alpine_node/deno/bun/_npmci, build-alpine-images.sh, test-alpine-images.sh)
- Update LICENSE copyright owner to Task Venture Capital GmbH
## 2025-10-26 - 5.1.0 - feat(alpine-deno)
Improve alpine deno image: switch to alpine:edge and use native Deno package, remove glibc workaround, update NVM/PATH, add local tooling settings and expanded README
- Dockerfile_alpine_deno: switch base image from alpine:latest to alpine:edge to use Alpine community Deno package
- Install Deno via apk (native musl build) and remove previous glibc installation/workaround
- Remove DENO_INSTALL env and adjust PATH to include NVM-managed Node binary path
- Keep NVM installation and make nvm available globally; set NODE_VERSION_LTS and default alias
- Add .claude/settings.local.json with local permissions for build/run tooling
- Add / expand README (readme.md) with usage, flavours and NVM/npmci guidance
## 2025-10-26 - 5.0.148 - feat(alpine)
Major restructuring: Multi-architecture Alpine Docker images with modern runtime support
**Breaking Changes:**
- Removed `Dockerfile_alpine` (replaced by `Dockerfile_alpine_node`)
- Removed `Dockerfile_iot` (no longer needed with multi-arch approach)
- Tag naming simplified: `:alpine-node` instead of `:alpine-x64-node` and `:alpine-arm64-node`
**New Multi-Architecture Alpine Images (3 variants):**
All images support both amd64 and arm64 architectures natively:
- `Dockerfile_alpine_node``:alpine-node` - Alpine with Node.js LTS + NVM + pnpm
- `Dockerfile_alpine_deno``:alpine-deno` - Alpine with Node.js LTS + NVM + Deno
- `Dockerfile_alpine_bun``:alpine-bun` - Alpine with Node.js LTS + NVM + Bun
**Technical Improvements:**
- **Multi-architecture support**: Single Docker image works natively on both x64 (AMD64) and ARM64 (Apple Silicon, ARM servers)
- **docker buildx integration**: Build script uses buildx for proper multi-platform image creation
- **Native performance**: No emulation needed - images run at full native speed on both architectures
- **Automatic platform selection**: Docker automatically pulls the correct architecture variant
- Full NVM support in all Alpine images (v0.40.1)
- Node.js musl builds from unofficial-builds.nodejs.org for Alpine compatibility
- Significantly smaller image sizes (200-300MB vs 800MB+ Ubuntu)
- All images include NVM for flexible version management
- Reused wrapper scripts from Ubuntu base for consistency
- Added Bun and Deno runtime support
**Build & Test Infrastructure:**
- Updated `build-alpine-images.sh` to use `docker buildx` with native platform builds for local testing
- Updated `test-alpine-images.sh` to test 3 multi-arch images instead of 9 architecture-specific images
- Simplified test suite focuses on runtime functionality and NVM version switching
**Documentation:**
- Updated README with multi-architecture approach explanation
- Simplified examples using new tag names (`:alpine-node`, `:alpine-deno`, `:alpine-bun`)
- Added cross-platform development examples
- Documented native performance benefits
- Removed architecture-specific instructions (no longer needed)
## 2025-10-26 - 5.0.147 - feat(nvm)
Enable full nvm support in Docker builds and CI/CD workflows
- Added global nvm configuration in /etc/bash.bashrc (prepended before interactive check)
- Created bash-with-nvm wrapper for Dockerfile RUN commands
- Added intelligent ENTRYPOINT for runtime nvm support
- nvm commands now work directly in Dockerfile RUN without manual sourcing
- nvm commands work in CI/CD workflow bash -c scripts automatically
- Changed default SHELL directive to use nvm wrapper
- Backward compatible: npmci still available, ENV PATH preserved for fallback
- Non-bash shells fall back to ENV PATH (v20.12.2)
- Both interactive and non-interactive shells have full nvm access
## 2024-11-17 - 5.0.146 - fix(Dockerfiles)
Correct Docker image source host in various Dockerfiles
- Updated the source host from 'hosttoday/ht-docker-node' to 'host.today/ht-docker-node' in several Dockerfiles
## 2024-11-17 - 5.0.145 - fix(docs)
Minor documentation updates without code changes.
## 2024-11-17 - 5.0.144 - fix(ci)
Update Docker container source for workflow to new registry
- Changed Docker container image source in .gitea/workflows/docker_tags.yaml to code.foss.global.
## 2024-11-17 - 5.0.143 - fix(core)
No uncommitted changes
- No changes detected. All files are up-to-date.
## 2024-05-26 - 5.0.139 to 5.0.142 - Core updates
Routine updates to the core functionality.
## 2024-05-23 - 5.0.124 to 5.0.138 - Core updates
Routine updates to the core functionality.
## 2024-04-23 - 5.0.114 to 5.0.123 - Core updates
Routine updates to the core functionality.
## 2024-04-14 - 5.0.113 to 5.0.113 - Core updates
Routine updates to the core functionality.
## 2023-04-02 - 5.0.105 to 5.0.112 - Core updates
Routine updates to the core functionality.
## 2022-12-17 - 5.0.101 to 5.0.104 - Core updates
Routine updates to the core functionality.
## 2022-10-17 - 5.0.91 to 5.0.100 - Core updates
Routine updates to the core functionality.
## 2022-10-11 - 5.0.85 to 5.0.90 - Core updates
Routine updates to the core functionality.
## 2022-08-05 - 5.0.78 to 5.0.84 - Core updates
Routine updates to the core functionality.
## 2022-03-22 - 5.0.75 to 5.0.77 - Core updates
Routine updates to the core functionality.
## 2021-11-12 - 5.0.67 to 5.0.74 - Core updates
Routine updates to the core functionality.
## 2021-10-22 - 5.0.61 to 5.0.66 - Core updates
Routine updates to the core functionality.
## 2020-05-28 - 5.0.55 to 5.0.60 - Core updates
Routine updates to the core functionality.
## 2019-11-19 - 5.0.50 to 5.0.54 - Core and Snyk fixes
Core updates and restored Snyk to the latest version.
## 2016-08-31 - 4.3.2 to 4.3.5 - Core updates
Routine updates to the core functionality.
## 2016-06-01 - 4.3.1 - Multiple enhancements
Implemented various features and fixes in the project.
- Updated .gitlab-ci.yml multiple times
- Added Python3 support
- Added new features and fixed various issues

View File

@@ -0,0 +1,90 @@
# Image Support Files
This directory contains helper scripts that are copied into the Docker image during build to enable NVM functionality.
## Files
### `bash-with-nvm`
**Purpose**: Wrapper script for Dockerfile RUN commands
**Usage**: Set as SHELL directive in Dockerfile
```dockerfile
SHELL ["/usr/local/bin/bash-with-nvm"]
```
**What it does**:
- Sources nvm before executing each Dockerfile RUN command
- Enables direct usage of `nvm` commands without manual sourcing
- Example: `RUN nvm install 18` works without `bash -c "source ..."`
**Location in image**: `/usr/local/bin/bash-with-nvm`
**How it works**:
1. Exports NVM_DIR environment variable
2. Sources `$NVM_DIR/nvm.sh` to load nvm functions
3. Executes the command passed to it via `eval "$@"`
---
### `docker-entrypoint.sh`
**Purpose**: ENTRYPOINT script for runtime nvm support
**Usage**: Set as ENTRYPOINT in Dockerfile
```dockerfile
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
```
**What it does**:
- Makes nvm available in `docker run ... bash -c` commands
- Enables nvm in CI/CD workflow scripts
- Passes through non-bash commands unchanged
**Location in image**: `/usr/local/bin/docker-entrypoint.sh`
**How it works**:
1. Loads nvm in the entrypoint environment
2. Detects if command is `bash -c ...`
3. If yes: Injects `source /etc/bash.bashrc` before the user's command
4. If no: Executes command as-is with `exec "$@"`
**Examples**:
- `docker run image bash -c "nvm install 18"` → nvm is available
- `docker run image node --version` → Passes through to node binary
- CI/CD: `run: nvm install 19` → Works automatically
---
## Why These Scripts Are Needed
**The Problem**:
- nvm is a bash function, not a binary executable
- It must be sourced into each shell session
- Docker RUN commands and `bash -c` don't automatically source it
**The Solution**:
1. **bash-with-nvm**: Makes Dockerfile RUN commands work
2. **docker-entrypoint.sh**: Makes runtime `bash -c` commands work
3. **/etc/bash.bashrc** (configured in Dockerfile): Makes interactive shells work
Together, these provide seamless nvm access in all contexts.
---
## Maintenance
**Modifying the scripts**:
1. Edit the file in this directory
2. Rebuild the Docker image
3. Test with both `docker build` and `docker run` scenarios
**Testing checklist**:
- [ ] `RUN nvm install 18` works in Dockerfile
- [ ] `docker run image bash -c "nvm install 18"` works
- [ ] `docker run image node --version` still works (fallback)
- [ ] CI/CD workflows can use nvm commands
**Debugging**:
- View script in running container: `docker run image cat /usr/local/bin/bash-with-nvm`
- Test entrypoint manually: `docker run --entrypoint /bin/bash image -c "nvm --version"`

View File

@@ -0,0 +1,9 @@
#!/bin/bash
set -e
# Load nvm before executing Dockerfile RUN commands
export NVM_DIR="/usr/local/nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
# Execute the command passed to this wrapper
eval "$@"

View File

@@ -0,0 +1,14 @@
#!/bin/bash
set -e
# Load nvm in the entrypoint environment
export NVM_DIR="/usr/local/nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
# If command is bash -c, inject bashrc sourcing to make nvm available
if [ "$1" = "bash" ] && [ "$2" = "-c" ]; then
shift 2
exec bash -c "source /etc/bash.bashrc && $*"
else
exec "$@"
fi

View File

@@ -1,18 +1,49 @@
{
"gitzone": {
"module": {
"githost": "gitlab.com",
"githost": "code.foss.global",
"gitscope": "hosttoday",
"gitrepo": "ht-docker-node",
"shortDescription": "docker image with nodejs and shipzone.io support",
"npmPackagename": "@hosttoday/ht-docker-node",
"license": "MIT"
"license": "MIT",
"description": "A Docker image that integrates Node.js with shipzone.io support.",
"keywords": [
"Docker",
"Node.js",
"shipzone.io",
"npm",
"CI",
"git",
"ssh",
"szci",
"node version management",
"typescript"
]
}
},
"npmci": {
"szci": {
"dockerRegistries": [
"docker.io",
"registry.gitlab.com"
]
},
"@git.zone/tsdocker": {
"registries": [
"code.foss.global",
"registry.gitlab.com",
"docker.io"
],
"registryRepoMap": {
"code.foss.global": "host.today/ht-docker-node",
"registry.gitlab.com": "hosttoday/ht-docker-node",
"docker.io": "hosttoday/ht-docker-node"
},
"platforms": ["linux/amd64", "linux/arm64"],
"push": false,
"testDir": "./test"
},
"tsdoc": {
"legal": "\n## License and Legal Information\n\nThis repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository. \n\n**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.\n\n### Trademarks\n\nThis project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.\n\n### Company Information\n\nTask Venture Capital GmbH \nRegistered at District court Bremen HRB 35230 HB, Germany\n\nFor any legal inquiries or if you require further information, please contact us via email at hello@task.vc.\n\nBy using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.\n"
}
}

5
package-lock.json generated
View File

@@ -1,5 +0,0 @@
{
"name": "ht-docker-node",
"version": "5.0.86",
"lockfileVersion": 1
}

View File

@@ -1,35 +1,37 @@
{
"name": "ht-docker-node",
"version": "5.0.86",
"description": "docker image with nodejs and shipzone.io support",
"version": "5.4.0",
"description": "A Docker image that integrates Node.js with shipzone.io support.",
"main": "index.js",
"scripts": {
"test": "echo \"no npm test specified\"",
"build": "echo \"Not needed for now\""
"build": "tsdocker build",
"release": "tsdocker push"
},
"repository": {
"type": "git",
"url": "git+https://github.com/HostToday/ht-docker-node.git"
},
"author": "Lossless GmbH",
"author": "Task Venture Capital GmbH",
"license": "MIT",
"bugs": {
"url": "https://github.com/HostToday/ht-docker-node/issues"
},
"homepage": "https://github.com/HostToday/ht-docker-node#readme",
"private": true,
"files": [
"ts/*",
"ts_web/*",
"dist/*",
"dist_web/*",
"dist_ts_web/*",
"assets/*",
"cli.js",
"npmextra.json",
"readme.md"
],
"directories": {
"test": "test"
}
},
"keywords": [
"Docker",
"Node.js",
"shipzone.io",
"npm",
"CI",
"git",
"ssh",
"szci",
"node version management",
"typescript"
]
}

9
pnpm-lock.yaml generated Normal file
View File

@@ -0,0 +1,9 @@
lockfileVersion: '9.0'
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
importers:
.: {}

97
readme.hints.md Normal file
View File

@@ -0,0 +1,97 @@
# Technical Implementation Notes
## NVM Support (v5.2.0)
### 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 v24.13.0
- 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, szci, ENV PATH fallback
- ✅ Multi-stage builds: nvm available in all stages
- ✅ Interactive shells: Full nvm access
### Maintenance Notes
**If updating nvm version**: Modify line 87 in Dockerfile (currently NVM v0.40.1)
**If base image changes**: Verify /etc/bash.bashrc structure still has early return pattern
## Ubuntu 24.04 Upgrade Notes
- Base image upgraded from Ubuntu 20.04 to 24.04
- Python 2 removed (EOL since 2020), Python 3 retained
- Package changes for 24.04 compatibility:
- `gconf-service` and `libgconf-2-4` removed (deprecated GConf)
- `libgcc1` replaced with `libgcc-s1`
- `libappindicator1` replaced with `libayatana-appindicator3-1`
- `libasound2` replaced with `libasound2t64` (t64 transition)
- `libgbm1` and `libatk-bridge2.0-0` added for Chrome/Puppeteer
- MongoDB upgraded from 4.4 to 8.0 (uses modern gpg keyring approach instead of deprecated apt-key)
- Node.js upgraded to v24.13.0 LTS (Krypton, supported until April 2028)
**If ENTRYPOINT conflicts**: Users can override with `--entrypoint` flag:
```bash
docker run --entrypoint /bin/bash image -c "commands"
```

546
readme.md
View File

@@ -1,59 +1,521 @@
# @hosttoday/ht-docker-node
docker image with nodejs and [ship.zone](https://ship.zone) support
# 🐳 ht-docker-node
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@hosttoday/ht-docker-node)
* [gitlab.com (source)](https://gitlab.com/hosttoday/ht-docker-node)
* [github.com (source mirror)](https://github.com/hosttoday/ht-docker-node)
* [docs (typedoc)](https://hosttoday.gitlab.io/ht-docker-node/)
> Production-ready Docker images for Node.js development with multi-architecture support, modern runtimes, and intelligent version management.
## Status for master
[![build status](https://gitlab.com/hosttoday/ht-docker-node/badges/master/build.svg)](https://gitlab.com/hosttoday/ht-docker-node/commits/master)
[![coverage report](https://gitlab.com/hosttoday/ht-docker-node/badges/master/coverage.svg)](https://gitlab.com/hosttoday/ht-docker-node/commits/master)
[![npm downloads per month](https://img.shields.io/npm/dm/@hosttoday/ht-docker-node.svg)](https://www.npmjs.com/package/@hosttoday/ht-docker-node)
[![Known Vulnerabilities](https://snyk.io/test/npm/@hosttoday/ht-docker-node/badge.svg)](https://snyk.io/test/npm/@hosttoday/ht-docker-node)
[![TypeScript](https://img.shields.io/badge/TypeScript->=%203.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
[![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
[![JavaScript Style Guide](https://img.shields.io/badge/code%20style-prettier-ff69b4.svg)](https://prettier.io/)
**Multi-arch ready****Alpine & Ubuntu****NVM built-in****Bun, Deno & pnpm****CI/CD optimized**
## Usage
---
The purpose of this Docker image is to provide a robust base for node apps and CI.
It comes in different flavours and all of them have node, npm, git and ssh in PATH.
## 🚀 Quick Start
The **:npmci flavour** has npmci in path and can install any required node version and update PATH accordingly:
```bash
# Pull and run the latest Node.js LTS image
docker pull registry.gitlab.com/hosttoday/ht-docker-node:latest
docker run -it registry.gitlab.com/hosttoday/ht-docker-node:latest
```Dockerfile
FROM hosttoday/ht-docker-node:npmci
RUN npmci install [node_version_number] // this installs node using node and sets the default to the new node and npm versions
# Or use Alpine for smaller images (200MB vs 800MB+)
docker pull registry.gitlab.com/hosttoday/ht-docker-node:alpine-node
```
## Availability
## 📦 Available Images
| Registry | Image Path |
| --------------- | -------------------------------------------- |
| GitLab Registry | registry.gitlab.com/hosttoday/ht-docker-node |
| Docker Hub | hosttoday/ht-docker-node |
### Ubuntu-Based Images (Full-Featured)
## Flavour Overview
Perfect for complex builds requiring native dependencies and maximum compatibility.
- **:lts** - node lts version, equals :latest
- **:stable** - node stable version
- **:npmci** - npmci preinstalled
- **:npmts** - npmci + npmts preinstalled
- **:npmpage** - npmci + npmts + npmpage preinstalled
- **:mongo** - npmci + npmts + mongo
| Tag | Description | Use Case |
|-----|-------------|----------|
| `:latest` | Node.js LTS with NVM (Ubuntu 24.04) | General purpose, production builds |
| `:lts` | Based on latest | Explicit LTS naming |
| `:szci` | With szci preinstalled | CI/CD pipelines |
For further information read the linked docs at the top of this README.
> **All images include [tini](https://github.com/krallin/tini) as PID 1 init**, ensuring proper signal forwarding and zombie process reaping out of the box.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
> | By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
### Alpine-Based Images (Lightweight & Multi-Arch) ⚡
[![repo-footer](https://hosttoday.gitlab.io/assets/repo-footer.svg)](https://host.today)
**40-60% smaller** than Ubuntu images. Native performance on **both x64 and ARM64** (Apple Silicon, ARM servers).
For further information read the linked docs at the top of this readme.
| Tag | Description | Size | Architectures |
|-----|-------------|------|---------------|
| `:alpine-node` | Node.js LTS + NVM + pnpm | ~200MB | amd64, arm64 |
| `:alpine-deno` | Node.js LTS + NVM + Deno | ~180MB | amd64, arm64 |
| `:alpine-bun` | Node.js LTS + NVM + Bun | ~150MB | amd64, arm64 |
| `:alpine-szci` | Alpine Node + szci + build tools | ~250MB | amd64, arm64 |
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
**✨ Multi-architecture magic:** Docker automatically selects the right image for your platform. Build on Mac, deploy on Linux servers—same Dockerfile, native speed everywhere.
[![repo-footer](https://lossless.gitlab.io/publicrelations/repofooter.svg)](https://maintainedby.lossless.com)
> **Note:** The Deno image uses Alpine edge to access the official musl-compiled Deno package from Alpine's community repository.
---
## 💡 Key Features
### 🔄 NVM (Node Version Manager) Built-In
Switch Node.js versions **instantly** without rebuilding images:
```dockerfile
FROM registry.gitlab.com/hosttoday/ht-docker-node:latest
# Works directly in RUN commands - no sourcing needed!
RUN nvm install 18.20.0
RUN nvm use 18 && npm install
RUN nvm install 20 && nvm use 20 && npm test
# Set default for subsequent commands
RUN nvm install 19 && nvm alias default 19
```
### 🎯 CI/CD Workflow Ready
NVM works seamlessly in GitHub Actions, GitLab CI, and other automation:
```yaml
# .gitlab-ci.yml
test:
image: registry.gitlab.com/hosttoday/ht-docker-node:latest
script:
- nvm install 18
- nvm use 18
- npm ci
- npm test
# Test on multiple Node versions
- nvm install 20
- nvm use 20
- npm test
```
### 🏔️ Alpine: Production-Optimized
```dockerfile
FROM registry.gitlab.com/hosttoday/ht-docker-node:alpine-node
# Same NVM commands as Ubuntu
RUN nvm install 20 && nvm use 20
RUN pnpm install
RUN pnpm build
# Result: 200MB image vs 800MB+ Ubuntu
```
**Why Alpine?**
-**60-75% smaller images** → Faster deployments
-**Reduced attack surface** → Better security
-**Native musl builds** → No glibc compatibility issues
-**Multi-arch support** → One image, all platforms
---
## 🛠️ Usage Examples
### Basic Node.js Application
```dockerfile
FROM registry.gitlab.com/hosttoday/ht-docker-node:alpine-node
WORKDIR /app
# NVM is already configured, Node.js LTS is ready
COPY package*.json ./
RUN pnpm install
COPY . .
RUN pnpm build
EXPOSE 3000
CMD ["node", "dist/index.js"]
```
### Multi-Version Testing
```dockerfile
FROM registry.gitlab.com/hosttoday/ht-docker-node:latest
WORKDIR /app
COPY package*.json ./
# Test on Node 18
RUN nvm install 18 && nvm use 18 && npm ci && npm test
# Test on Node 20
RUN nvm install 20 && nvm use 20 && npm ci && npm test
# Use Node 20 for production build
RUN nvm alias default 20 && npm run build
```
### Deno Application
```dockerfile
FROM registry.gitlab.com/hosttoday/ht-docker-node:alpine-deno
WORKDIR /app
# Both Deno and Node.js are available
COPY . .
# Use Deno for the app
CMD ["deno", "run", "--allow-net", "main.ts"]
# Or switch to Node.js if needed
# RUN nvm use default && npm install
```
### Bun for Ultra-Fast Builds
```dockerfile
FROM registry.gitlab.com/hosttoday/ht-docker-node:alpine-bun
WORKDIR /app
# Bun is 10-20x faster for package installation
COPY package.json bun.lockb ./
RUN bun install
COPY . .
RUN bun run build
# Node.js also available via NVM
CMD ["bun", "run", "start"]
```
### TypeScript Project with Multi-Stage Build
```dockerfile
# Build stage
FROM registry.gitlab.com/hosttoday/ht-docker-node:alpine-node AS builder
WORKDIR /app
COPY package*.json ./
RUN pnpm install
COPY tsconfig.json ./
COPY src ./src
RUN pnpm build
# Production stage
FROM registry.gitlab.com/hosttoday/ht-docker-node:alpine-node
WORKDIR /app
COPY package*.json ./
RUN pnpm install --prod
COPY --from=builder /app/dist ./dist
EXPOSE 3000
CMD ["node", "dist/index.js"]
```
---
## 🔧 NVM Usage Patterns
### In Dockerfiles
```dockerfile
# Install specific version
RUN nvm install 18.20.0
# Use version
RUN nvm use 18
# Set default (persists across RUN commands)
RUN nvm alias default 18
# Chain commands in single RUN
RUN nvm install 19 && nvm use 19 && npm install
```
### In CI/CD Scripts
```bash
#!/bin/bash
# NVM is automatically available in bash scripts
nvm install 20
nvm use 20
npm ci
npm test
```
### Version Switching
```bash
# List installed versions
nvm ls
# Install and switch to latest LTS
nvm install --lts
nvm use --lts
# Install specific version
nvm install 18.20.0
# Use installed version
nvm use 18
```
---
## 🏗️ Building Multi-Architecture Images
This project uses [@git.zone/tsdocker](https://code.foss.global/git.zone/tsdocker) for Docker image management.
```bash
# Install tsdocker
pnpm install -g @git.zone/tsdocker@latest
# List all discovered Dockerfiles and their tags
tsdocker list
# Build all images (multi-arch: amd64 + arm64)
tsdocker build
# Test all images
tsdocker test
# Push to a specific registry
tsdocker push code.foss.global
```
### Manual Builds
For building individual images manually:
```bash
# Build for both amd64 and arm64, push to registry
docker buildx build \
--platform linux/amd64,linux/arm64 \
-f Dockerfile_alpine-node \
-t your-registry/your-image:alpine-node \
--push \
.
```
---
## 📚 Advanced Examples
### Docker Compose Setup
```yaml
version: '3.8'
services:
app:
image: registry.gitlab.com/hosttoday/ht-docker-node:alpine-node
working_dir: /app
volumes:
- .:/app
- /app/node_modules
ports:
- "3000:3000"
environment:
- NODE_ENV=development
command: sh -c "pnpm install && pnpm dev"
mongo:
image: mongo:latest
ports:
- "27017:27017"
```
### GitHub Actions Workflow
```yaml
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
container:
image: registry.gitlab.com/hosttoday/ht-docker-node:alpine-node
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: pnpm install
- name: Run tests
run: pnpm test
- name: Test on multiple Node versions
run: |
for version in 18 20; do
echo "Testing on Node $version"
nvm install $version
nvm use $version
pnpm test
done
```
### Custom Base Image
```dockerfile
FROM registry.gitlab.com/hosttoday/ht-docker-node:alpine-node
# Add your custom tools
RUN apk add --no-cache \
python3 \
make \
g++ \
postgresql-client
# Configure your environment
ENV DATABASE_URL="postgresql://localhost/mydb"
# Your app setup
WORKDIR /app
COPY package.json pnpm-lock.yaml ./
RUN pnpm install
COPY . .
CMD ["pnpm", "start"]
```
---
## 🎓 Best Practices
### ✅ DO
- **Use Alpine images for production** (smaller, more secure)
- **Pin Node versions in production** (`nvm alias default 20.11.0`)
- **Use multi-stage builds** to reduce final image size
- **Leverage build cache** with proper COPY order
- **Run as non-root user** in production
### ❌ DON'T
- Don't use `:latest` tag in production (be explicit)
- Don't install packages globally if local works
- Don't copy `node_modules` (let the build install them)
- Don't skip `.dockerignore` (keeps builds fast)
### 🔒 Security Tips
```dockerfile
# Example: Production-hardened Dockerfile
FROM registry.gitlab.com/hosttoday/ht-docker-node:alpine-node
# Create non-root user
RUN addgroup -g 1001 -S nodejs && adduser -S nodejs -u 1001
WORKDIR /app
# Install deps as root
COPY package*.json ./
RUN pnpm install --frozen-lockfile && pnpm cache clean
# Copy source
COPY --chown=nodejs:nodejs . .
# Build
RUN pnpm build
# Switch to non-root user
USER nodejs
EXPOSE 3000
CMD ["node", "dist/index.js"]
```
---
## 🐛 Troubleshooting
### NVM command not found
If NVM isn't available in your script:
```bash
# Manually source NVM (shouldn't be needed in our images)
export NVM_DIR="/usr/local/nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
```
### Alpine native module build failures
Some npm packages need build tools:
```dockerfile
FROM registry.gitlab.com/hosttoday/ht-docker-node:alpine-node
# Install build dependencies
RUN apk add --no-cache python3 make g++
# Now install your packages
RUN pnpm install
```
### Permission denied errors
```dockerfile
# Fix ownership before switching users
COPY --chown=node:node . .
USER node
```
---
## 📊 Image Comparison
| Feature | Ubuntu `:latest` | Alpine `:alpine-node` |
|---------|------------------|----------------------|
| Base Size | ~900MB | ~200MB |
| Build Tools | ✅ Full | ⚠️ Install separately |
| Compatibility | ✅ Maximum | ✅ Good (musl) |
| Multi-arch | ❌ amd64 only | ✅ amd64, arm64 |
| Security | ✅ Good | ✅ Excellent (smaller surface) |
| Speed | Fast | Faster (smaller) |
| Use Case | Complex builds | Production, CI/CD |
---
## 🔗 Useful Links
- **GitHub Repository:** https://github.com/HostToday/ht-docker-node
- **Docker Hub:** registry.gitlab.com/hosttoday/ht-docker-node
- **NVM Documentation:** https://github.com/nvm-sh/nvm
- **Alpine Linux:** https://alpinelinux.org/
- **Node.js Unofficial Builds:** https://unofficial-builds.nodejs.org/ (musl support)
---
## 📋 Changelog
See [changelog.md](changelog.md) for detailed version history.
**Latest Updates (v5.0.148):**
- ✨ Multi-architecture Alpine images (amd64 + arm64)
- ✨ Native Deno support via Alpine edge
- ✨ Bun runtime integration
- ✨ Simplified image tags (`:alpine-node` vs `:alpine-x64-node`)
- 🚀 docker buildx integration for cross-platform builds
- 📦 pnpm preinstalled on Alpine Node image
- 🔧 NVM 0.40.1 with improved Alpine/musl support
---
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

18
test/test_alpine-bun.sh Executable file
View File

@@ -0,0 +1,18 @@
#!/bin/bash
set -e
echo "Testing alpine-bun image..."
# Test NVM
echo "Testing NVM..."
nvm --version
# Test Node.js
echo "Testing Node.js..."
node --version
# Test Bun
echo "Testing Bun..."
bun --version
echo "alpine-bun tests passed!"

18
test/test_alpine-deno.sh Executable file
View File

@@ -0,0 +1,18 @@
#!/bin/bash
set -e
echo "Testing alpine-deno image..."
# Test NVM
echo "Testing NVM..."
nvm --version
# Test Node.js
echo "Testing Node.js..."
node --version
# Test Deno
echo "Testing Deno..."
deno --version
echo "alpine-deno tests passed!"

24
test/test_alpine-node.sh Executable file
View File

@@ -0,0 +1,24 @@
#!/bin/bash
set -e
echo "Testing alpine-node image..."
# Test NVM
echo "Testing NVM..."
nvm --version
# Test Node.js
echo "Testing Node.js..."
node --version
# Test pnpm
echo "Testing pnpm..."
pnpm --version
# Test NVM version switching
echo "Testing NVM version switching..."
nvm install 18
nvm use 18
node --version | grep v18
echo "alpine-node tests passed!"

View File

@@ -1 +1,32 @@
echo "this runs within latest container!";
#!/bin/bash
set -e
echo "Testing latest image..."
# Test NVM
echo "Testing NVM..."
nvm --version
# Test Node.js
echo "Testing Node.js..."
node --version
# Test pnpm
echo "Testing pnpm..."
pnpm --version
# Test Bun
echo "Testing Bun..."
bun --version
# Test Deno
echo "Testing Deno..."
deno --version
# Test NVM version switching
echo "Testing NVM version switching..."
nvm install 22
nvm use 22
node --version | grep v22
echo "latest tests passed!"

View File

@@ -1,11 +0,0 @@
# check if npmci is available
npm init -y
npmci -v
npm set registry https://verdaccio.lossless.one
# TODO update npmci to not require package.json
npmci node install stable
# check if npm picks it up
npmci command npm install -g @gitzone/tsrun
npmci command tsrun -v

View File

@@ -1,6 +1,8 @@
#!/bin/bash
set -e
# npm
npm -v
node -v
npm set registry https://verdaccio.lossless.one
npm install -g @gitzone/tsrun
# tsrun -v
pnpm install -g @gitzone/tsrun
tsrun -v

13
test/test_szci.sh Normal file
View File

@@ -0,0 +1,13 @@
#!/bin/bash
set -e
# check if szci is available
npm init -y
szci -v
# TODO update szci to not require package.json
szci node install stable
# check if npm picks it up
szci command pnpm install -g @gitzone/tsrun
szci command tsrun -v

View File

@@ -1,17 +0,0 @@
{
"extends": ["tslint:latest", "tslint-config-prettier"],
"rules": {
"semicolon": [true, "always"],
"no-console": false,
"ordered-imports": false,
"object-literal-sort-keys": false,
"member-ordering": {
"options":{
"order": [
"static-method"
]
}
}
},
"defaultSeverity": "warning"
}