Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# EditorConfig is awesome: http://EditorConfig.org

root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 4

[Makefile]
indent_style = tab

[*.{json,yml,yaml}]
indent_size = 2
26 changes: 26 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Dockette / Node.js

Node.js images with npm and git, one tag per Node.js major version.

## Stack

- Docker image built with `docker buildx`, base `dockette/alpine` (older majors use `node:<n>-alpine`)
- Node.js 6 to 26 from Alpine packages, with npm and git
- Published to Docker Hub as `dockette/nodejs` for linux/amd64 and linux/arm64 by GitHub Actions

## Development

```bash
make build-v24 # build one version (v6 to v26)
docker run --rm dockette/nodejs:v24 node --version # smoke test it
```

There are no `build`, `test` or `run` targets. Run `make` to list every target.

## Principles

- KISS: one image does one job; no extra services or tools.
- DRY: shared steps live in the base image, not copied into every Dockerfile.
- YAGNI: add a package only when the image needs it.
- Pin versions, keep layers small, clean package caches in the same `RUN`.
- Every change is built and smoke tested with `make build-v<n>` before a commit.
93 changes: 72 additions & 21 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
DOCKER_IMAGE=dockette/nodejs

.DEFAULT_GOAL := help

##@ Help

.PHONY: help
help: ## Show this help
@awk 'BEGIN {FS = ":.*##"; printf "Usage: make \033[36m<target>\033[0m\n"} /^[a-zA-Z0-9_.-]+:.*##/ { sub(/^ +/, "", $$2); printf " \033[36m%-20s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) }' $(firstword $(MAKEFILE_LIST))

##@ Versions

_docker-build-%: VERSION=$*
_docker-build-%:
docker buildx \
Expand All @@ -9,24 +19,65 @@ _docker-build-%:
-t ${DOCKER_IMAGE}:${VERSION} \
./${VERSION}

build-v6: _docker-build-v6
build-v7: _docker-build-v7
build-v8: _docker-build-v8
build-v9: _docker-build-v9
build-v10: _docker-build-v10
build-v11: _docker-build-v11
build-v12: _docker-build-v12
build-v13: _docker-build-v13
build-v14: _docker-build-v14
build-v15: _docker-build-v15
build-v16: _docker-build-v16
build-v17: _docker-build-v17
build-v18: _docker-build-v18
build-v19: _docker-build-v19
build-v20: _docker-build-v20
build-v21: _docker-build-v21
build-v22: _docker-build-v22
build-v23: _docker-build-v23
build-v24: _docker-build-v24
build-v25: _docker-build-v25
build-v26: _docker-build-v26
.PHONY: build-v6
build-v6: _docker-build-v6 ## Build the Node.js 6 image (v6)

.PHONY: build-v7
build-v7: _docker-build-v7 ## Build the Node.js 7 image (v7)

.PHONY: build-v8
build-v8: _docker-build-v8 ## Build the Node.js 8 image (v8)

.PHONY: build-v9
build-v9: _docker-build-v9 ## Build the Node.js 9 image (v9)

.PHONY: build-v10
build-v10: _docker-build-v10 ## Build the Node.js 10 image (v10)

.PHONY: build-v11
build-v11: _docker-build-v11 ## Build the Node.js 11 image (v11)

.PHONY: build-v12
build-v12: _docker-build-v12 ## Build the Node.js 12 image (v12)

.PHONY: build-v13
build-v13: _docker-build-v13 ## Build the Node.js 13 image (v13)

.PHONY: build-v14
build-v14: _docker-build-v14 ## Build the Node.js 14 image (v14)

.PHONY: build-v15
build-v15: _docker-build-v15 ## Build the Node.js 15 image (v15)

.PHONY: build-v16
build-v16: _docker-build-v16 ## Build the Node.js 16 image (v16)

.PHONY: build-v17
build-v17: _docker-build-v17 ## Build the Node.js 17 image (v17)

.PHONY: build-v18
build-v18: _docker-build-v18 ## Build the Node.js 18 image (v18)

.PHONY: build-v19
build-v19: _docker-build-v19 ## Build the Node.js 19 image (v19)

.PHONY: build-v20
build-v20: _docker-build-v20 ## Build the Node.js 20 image (v20)

.PHONY: build-v21
build-v21: _docker-build-v21 ## Build the Node.js 21 image (v21)

.PHONY: build-v22
build-v22: _docker-build-v22 ## Build the Node.js 22 image (v22)

.PHONY: build-v23
build-v23: _docker-build-v23 ## Build the Node.js 23 image (v23)

.PHONY: build-v24
build-v24: _docker-build-v24 ## Build the Node.js 24 image (v24)

.PHONY: build-v25
build-v25: _docker-build-v25 ## Build the Node.js 25 image (v25)

.PHONY: build-v26
build-v26: _docker-build-v26 ## Build the Node.js 26 image (v26)
96 changes: 65 additions & 31 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,41 +1,75 @@
# NodeJS
<h1 align=center>Dockette / Node.js</h1>

Ready-to-use images for NodeJS.
<p align=center>
<a href="https://github.com/dockette/nodejs/actions"><img src="https://github.com/dockette/nodejs/actions/workflows/docker.yml/badge.svg" alt="GitHub Actions"></a>
<a href="https://hub.docker.com/r/dockette/nodejs"><img src="https://img.shields.io/docker/pulls/dockette/nodejs.svg" alt="Docker Hub pulls"></a>
<a href="https://github.com/sponsors/f3l1x"><img src="https://img.shields.io/badge/sponsor-GitHub%20Sponsors-ea4aaa" alt="GitHub Sponsors"></a>
<a href="https://github.com/orgs/dockette/discussions"><img src="https://img.shields.io/badge/support-discussions-6f42c1" alt="Support/Discussions"></a>
</p>

<p align=center>
<a href="https://nodejs.org">Node.js</a> 6 to 26 with <code>npm</code> and <code>git</code>, one image per major version. Built on Alpine Linux with the Node.js package that Alpine ships, for CI jobs and build steps that need a specific Node.js major.
</p>

-----

[![Docker Stars](https://img.shields.io/docker/stars/dockette/nodejs.svg?style=flat)](https://hub.docker.com/r/dockette/nodejs/)
[![Docker Pulls](https://img.shields.io/docker/pulls/dockette/nodejs.svg?style=flat)](https://hub.docker.com/r/dockette/nodejs/)
## Usage

## Discussion / Help
Mount your project and run a command in it:

[![Join the chat](https://img.shields.io/gitter/room/dockette/dockette.svg?style=flat-square)](https://gitter.im/dockette/dockette?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
```sh
docker run -v "$(pwd)":/srv -w /srv dockette/nodejs:v24 npm ci
```

## Usage
The image adds `npm` and `git` to the Node.js package that Alpine ships, and sets no working directory, so pass
`-w`. The patch version moves with every rebuild; pin the major with the tag. See the
[Node.js documentation](https://nodejs.org/docs/latest/api/) for the runtime itself.

## Versions

Each tag is built for `linux/amd64` and `linux/arm64`. There is no `latest` tag; pin a major.

| Tag | Base | Upstream EOL | State |
|-----|------|--------------|-------|
| `dockette/nodejs:v26` | `dockette/alpine:3.24` | 2029-04-30 | Supported |
| `dockette/nodejs:v25` | `dockette/alpine:3.23` | 2026-06-01 | Legacy (EOL runtime) |
| `dockette/nodejs:v24` | `dockette/alpine:3.24` | 2028-04-30 | Supported |
| `dockette/nodejs:v23` | `dockette/alpine:3.21` | 2025-06-01 | Legacy (EOL runtime) |
| `dockette/nodejs:v22` | `dockette/alpine:3.22` | 2027-04-30 | Supported |
| `dockette/nodejs:v21` | `dockette/alpine:3.19` | 2024-06-01 | EOL runtime and base |
| `dockette/nodejs:v20` | `dockette/alpine:3.20` | 2026-04-30 | EOL runtime and base |
| `dockette/nodejs:v19` | `dockette/alpine:3.17` | 2023-06-01 | EOL runtime and base |
| `dockette/nodejs:v18` | `dockette/alpine:3.17` | 2025-04-30 | EOL runtime and base |
| `dockette/nodejs:v17` | `dockette/alpine:3.15` | 2022-06-01 | EOL runtime and base |
| `dockette/nodejs:v16` | `dockette/alpine:3.16` | 2023-09-11 | EOL runtime and base |
| `dockette/nodejs:v15` | `dockette/alpine:3.13` | 2021-06-01 | EOL runtime and base |
| `dockette/nodejs:v14` | `dockette/alpine:3.14` | 2023-04-30 | EOL runtime and base |
| `dockette/nodejs:v13` | `dockette/alpine:3.11` | 2020-06-01 | EOL runtime and base |
| `dockette/nodejs:v12` | `dockette/alpine:3.12` | 2022-04-30 | EOL runtime and base |
| `dockette/nodejs:v11` | `dockette/alpine:3.9` | 2019-06-01 | EOL runtime and base |
| `dockette/nodejs:v10` | `node:10-alpine` | 2021-04-30 | EOL runtime and base |
| `dockette/nodejs:v9` | `node:9-alpine` | 2018-06-30 | EOL runtime and base |
| `dockette/nodejs:v8` | `node:8-alpine` | 2019-12-31 | EOL runtime and base |
| `dockette/nodejs:v7` | `dockette/alpine:3.6` | 2017-06-30 | EOL runtime and base |
| `dockette/nodejs:v6` | `dockette/alpine:3.6` | 2019-04-30 | EOL runtime and base |

| NodeJS | OS | Tag |
|-----------------|--------------|---------------|
| NodeJS 26 | Alpine v3.24 | v26 |
| NodeJS 25 | Alpine v3.23 | v25 |
| NodeJS 24 | Alpine v3.24 | v24 |
| NodeJS 23 | Alpine v3.21 | v23 |
| NodeJS 22 | Alpine v3.22 | v22 |
| NodeJS 21 | Alpine v3.19 | v21 |
| NodeJS 20 | Alpine v3.20 | v20 |
| NodeJS 19 | Alpine v3.17 | v19 |
| NodeJS 18 | Alpine v3.17 | v18 |
| NodeJS 17 | Alpine v3.15 | v17 |
| NodeJS 16 | Alpine v3.16 | v16 |
| NodeJS 15 | Alpine v3.13 | v15 |
| NodeJS 14 | Alpine v3.14 | v14 |
| NodeJS 13 | Alpine v3.11 | v13 |
| NodeJS 12 | Alpine v3.12 | v12 |
| NodeJS 11 | Alpine v3.9 | v11 |
| NodeJS 10 | Alpine v3.8 | v10 |
| NodeJS 9 | Alpine v3.7 | v9 |
| NodeJS 8 | Alpine v3.7 | v8 |
| NodeJS 7 | Alpine v3.6 | v7 |
| NodeJS 6 | Alpine v3.6 | v6 |
> [!WARNING]
> Only `v22`, `v24` and `v26` get security fixes from upstream. The other tags run an EOL Node.js, most of them
> on an EOL Alpine release; use them only to build old projects.

The `v8`, `v9` and `v10` tags build on the official `node` images. They rename the `node` user to `dfx` and don't
include `git`. The `v6` to `v10` tags start `node` instead of `nodejs`.

## Development

```sh
make build-v26 # build the Node.js 26 image
make build-v24 # build the Node.js 24 image
make build-v22 # build the Node.js 22 image
```

Run `make` to list every target.

## Maintenance
See [how to contribute](https://github.com/dockette/.github/blob/master/CONTRIBUTING.md) to this package. Consider to [support](https://github.com/sponsors/f3l1x) **f3l1x**. Thank you for using this package.

See [how to contribute](https://github.com/dockette/.github/blob/master/CONTRIBUTING.md) to this package. Consider [supporting](https://github.com/sponsors/f3l1x) **f3l1x**. Thank you for using this package.
12 changes: 12 additions & 0 deletions fxnorm.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# fxnorm configuration, written by `fxnorm init`.
# `fxnorm config` prints what runs and why; `fxnorm rules` lists every rule with its group.

# A Dockette Docker image repository (a Dockerfile in the root or one folder below)
presets:
- dockette-image

# groups: # add a group, or drop one with a leading minus
# - -ci

# rules: # false, true, error, warning, or options
# common/agents-md-length: {min: 50, max: 120}