From 67e549af638795b62a7488fabbe20e173c93f9f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Oc=C3=B3n?= Date: Thu, 3 Sep 2026 12:42:06 +0200 Subject: [PATCH 1/2] fixing typo on README, improving CI checks to sync .tool-versions and docker builds --- .github/workflows/build-page.yaml | 20 +- .github/workflows/extension-tests.yaml | 22 ++- README.adoc | 33 +++- docker-compose.yml | 27 ++- scripts/check-node-version.sh | 260 +++++++++++++++++++++++++ trento-docs-site-ui/.nvmrc | 1 - versions.yml | 27 +++ 7 files changed, 381 insertions(+), 9 deletions(-) create mode 100755 scripts/check-node-version.sh delete mode 100644 trento-docs-site-ui/.nvmrc create mode 100644 versions.yml diff --git a/.github/workflows/build-page.yaml b/.github/workflows/build-page.yaml index cb7f0b35..6b4206cb 100644 --- a/.github/workflows/build-page.yaml +++ b/.github/workflows/build-page.yaml @@ -11,6 +11,8 @@ on: - 'trento-docs-site/**' - 'trento-docs-site-ui/build/ui-bundle.zip' - '.github/workflows/build-page.yaml' + - 'versions.yml' + - 'scripts/**' workflow_dispatch: schedule: - cron: '0 13 * * 4' # Every Thursday at 1:00 PM UTC @@ -22,16 +24,30 @@ concurrency: permissions: contents: read jobs: + prepare: + runs-on: ubuntu-24.04 + outputs: + node_image: ${{ steps.read-image.outputs.image }} + steps: + - name: Checkout repository + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - name: Read Node.js image from versions.yml + id: read-image + run: echo "image=$(scripts/check-node-version.sh image)" >> "$GITHUB_OUTPUT" + build: + needs: prepare runs-on: ubuntu-24.04 - # openSUSE-based SUSE BCI image with Node.js 24 preinstalled + # SUSE BCI image taken from versions.yml, the same one docker-compose.yml uses container: - image: registry.suse.com/bci/nodejs:24 + image: ${{ needs.prepare.outputs.node_image }} steps: - name: Checkout repository uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 + - name: Check the Node.js version against .tool-versions + run: scripts/check-node-version.sh - name: Configure Pages if: github.event_name != 'pull_request' uses: actions/configure-pages@45bfe0192ca1faeb007ade9deae92b16b8254a0d # v6.0.0 diff --git a/.github/workflows/extension-tests.yaml b/.github/workflows/extension-tests.yaml index beb176d8..937f4682 100644 --- a/.github/workflows/extension-tests.yaml +++ b/.github/workflows/extension-tests.yaml @@ -11,6 +11,8 @@ on: - 'trento-docs-site/package.json' - 'trento-docs-site/package-lock.json' - '.github/workflows/extension-tests.yaml' + - 'versions.yml' + - 'scripts/**' pull_request: types: [opened, synchronize, reopened] @@ -19,18 +21,34 @@ on: - 'trento-docs-site/package.json' - 'trento-docs-site/package-lock.json' - '.github/workflows/extension-tests.yaml' + - 'versions.yml' + - 'scripts/**' workflow_dispatch: jobs: + prepare: + runs-on: ubuntu-24.04 + outputs: + node_image: ${{ steps.read-image.outputs.image }} + steps: + - name: Checkout repository + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - name: Read Node.js image from versions.yml + id: read-image + run: echo "image=$(scripts/check-node-version.sh image)" >> "$GITHUB_OUTPUT" + test-extensions: + needs: prepare runs-on: ubuntu-24.04 - # openSUSE-based SUSE BCI image with Node.js 24 preinstalled + # SUSE BCI image taken from versions.yml, the same one docker-compose.yml uses container: - image: registry.suse.com/bci/nodejs:24 + image: ${{ needs.prepare.outputs.node_image }} steps: - name: Checkout repository uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - name: Check the Node.js version against .tool-versions + run: scripts/check-node-version.sh - name: Install dependencies working-directory: trento-docs-site run: npm ci --no-audit --no-fund diff --git a/README.adoc b/README.adoc index 51924055..e90eb8a9 100644 --- a/README.adoc +++ b/README.adoc @@ -2,7 +2,7 @@ ifndef::site-gen-antora[:relfileprefix: /content/] This repository is the central documentation source for the Trento project. -It brings together multiple documentation sources and publishes them to the link:https://www.trento-project.io/docs/[Trento documentation hub] and the official user-facing SUSE documentation at link:https://documentation.suse.com/de-de/sles-sap/trento/[documentation.suse.com]. +It brings together multiple documentation sources and publishes them to the link:https://www.trento-project.io/docs/[Trento documentation hub] and the official user-facing SUSE documentation at link:https://documentation.suse.com/sles-sap/trento/[documentation.suse.com]. == Repository Overview @@ -107,6 +107,37 @@ Examples: ** link:https://github.com/trento-project/web/tree/main/guides[`trento-project/web/guides`] ** link:https://github.com/trento-project/agent/tree/main/docs[`trento-project/agent/docs`] +=== Node.js version + +The Node.js version is defined once and reused everywhere: + +* link:https://github.com/trento-project/docs/blob/main/versions.yml[`versions.yml`] holds the container image. `docker-compose.yml` imports it with `extends`, so all container services run the same image, and the CI workflows read it into their job container. +* link:https://github.com/trento-project/docs/blob/main/.tool-versions[`.tool-versions`] holds the same version for the local toolchain (`asdf`, `mise`). + +`scripts/check-node-version.sh` keeps the two in sync. +It runs when each container starts and as a CI step, and fails the build if `versions.yml`, `.tool-versions`, and the running Node.js do not all agree: + +[source,bash] +---- +scripts/check-node-version.sh +---- + +To see the newest image tag published in `registry.suse.com`: + +[source,bash] +---- +scripts/check-node-version.sh latest +---- + +To upgrade Node.js, set the new version in both `versions.yml` and `.tool-versions`. + +To try another version without editing any file, override the tag: + +[source,bash] +---- +CONTAINER_IMAGE_TAG=24.18.0 docker compose up trento-docs +---- + === Preview the Trento docs hub From the repository root, this is the default way to preview the full docs hub workflow, including the current site assembly and published-output structure: diff --git a/docker-compose.yml b/docker-compose.yml index 8f0b38db..aa058c86 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,8 +1,13 @@ # SPDX-FileCopyrightText: SUSE LLC # SPDX-License-Identifier: Apache-2.0 +# Every Node.js service imports the image from versions.yml, so they all run the +# same Node.js and none of them can pin a different one. Each service verifies +# on start that the image matches .tool-versions. x-node-base: &node-base - image: registry.suse.com/bci/nodejs:24-base + extends: + file: versions.yml + service: node x-http-health: &http-health interval: 5s @@ -19,6 +24,7 @@ services: - trento-docs-node-modules:/workspace/trento-docs-site/node_modules command: > bash -lc " + /workspace/scripts/check-node-version.sh && npm ci && npx antora antora-playbook.yml " @@ -31,6 +37,7 @@ services: - .:/workspace:z command: > bash -lc " + /workspace/scripts/check-node-version.sh && npx --yes http-server build/trento-docs-site-public/ -c-1 -p 3000 " ports: @@ -61,8 +68,15 @@ services: - "${PORT:-3001}:3001" volumes: - ./trento/build/SLES-SAP-trento/html/SLES-SAP-trento:/srv:ro + # Only what the version check needs; the repository is not mounted here + - ./scripts:/workspace/scripts:ro + - ./versions.yml:/workspace/versions.yml:ro + - ./.tool-versions:/workspace/.tool-versions:ro command: > - bash -lc "npx --yes http-server /srv -c-1 -p 3001" + bash -lc " + /workspace/scripts/check-node-version.sh && + npx --yes http-server /srv -c-1 -p 3001 + " depends_on: suse-daps-build: condition: service_completed_successfully @@ -77,8 +91,15 @@ services: - "${PORTPDF:-3002}:3002" volumes: - ./trento/build/SLES-SAP-trento/:/srv:ro + # Only what the version check needs; the repository is not mounted here + - ./scripts:/workspace/scripts:ro + - ./versions.yml:/workspace/versions.yml:ro + - ./.tool-versions:/workspace/.tool-versions:ro command: > - bash -lc "npx --yes http-server /srv -c-1 -p 3002" + bash -lc " + /workspace/scripts/check-node-version.sh && + npx --yes http-server /srv -c-1 -p 3002 + " depends_on: suse-daps-build: condition: service_completed_successfully diff --git a/scripts/check-node-version.sh b/scripts/check-node-version.sh new file mode 100755 index 00000000..1b89ac1c --- /dev/null +++ b/scripts/check-node-version.sh @@ -0,0 +1,260 @@ +#!/usr/bin/env bash + +# SPDX-FileCopyrightText: SUSE LLC +# SPDX-License-Identifier: Apache-2.0 + +# Keeps the Node.js version consistent across development and every container. +# +# versions.yml holds the container image and is imported by docker-compose.yml +# and by the CI workflows. .tool-versions holds the version used by the local +# toolchain (asdf/mise). This script verifies that both agree with each other +# and with the Node.js actually running, and can report the newest image tag +# published in the registry. +# +# The registry, repository, version and flavour are never written down here: +# they are all derived from the single image reference in versions.yml. +# +# Usage: +# check-node-version.sh [check] verify versions.yml, .tool-versions and the +# running Node.js all match (default) +# check-node-version.sh version print the pinned version, e.g. 24.18.1 +# check-node-version.sh image print the pinned image reference +# check-node-version.sh latest print the newest matching tag in the registry + +set -euo pipefail + +root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +versions_file="$root/versions.yml" +tool_versions_file="$root/.tool-versions" + +die() { + echo "check-node-version: $*" >&2 + exit 1 +} + +# Compose silently refuses to load a file that is not valid YAML, and a text +# scan of it would not notice. Catch the mistake that is easy to make here: +# Dockerfile directives such as `ARG NAME=value`, which YAML reads as a bare +# scalar and which make the whole file unparseable. +lint_versions_file() { + local offenders + offenders="$(grep -nE '^[^[:space:]#]' "$versions_file" | + grep -vE '^[0-9]+:[A-Za-z0-9_.-]+:' || true)" + + [ -z "$offenders" ] || die "$versions_file is not valid YAML, Compose cannot load it. +Unexpected top-level line(s): +$offenders +ARG and ENV are Dockerfile directives; use \${NAME:-default} interpolation instead." +} + +# Resolve Compose interpolation the way Compose does: an environment variable +# wins, otherwise the :- default written in the file is used. +resolve_interpolation() { + local text="$1" name default value + + while [[ "$text" =~ \$\{([A-Za-z_][A-Za-z0-9_]*)(:?-([^}]*))?\} ]]; do + name="${BASH_REMATCH[1]}" + default="${BASH_REMATCH[3]}" + value="${!name:-$default}" + text="${text/"${BASH_REMATCH[0]}"/$value}" + done + + echo "$text" +} + +# The single image reference in versions.yml, with interpolation applied. +pinned_image() { + [ -f "$versions_file" ] || die "$versions_file not found" + lint_versions_file + + local image + image="$(awk '/^[[:space:]]+image:[[:space:]]*/ { + sub(/^[[:space:]]*image:[[:space:]]*/, "") + gsub(/["'\'']/, "") + print + exit + }' "$versions_file")" + + [ -n "$image" ] || die "no image found in $versions_file" + + image="$(resolve_interpolation "$image")" + + case "$image" in + *:) die "the image tag in $versions_file resolved to an empty value: $image" ;; + esac + + echo "$image" +} + +# Tag of the pinned image, e.g. 24.18.1-base +pinned_tag() { + local image last + image="$(pinned_image)" + last="${image##*/}" + + case "$last" in + *:*) echo "${last##*:}" ;; + *) die "the image in $versions_file has no tag: $image" ;; + esac +} + +# Registry host of the pinned image, e.g. registry.suse.com +pinned_registry() { + local image + image="$(pinned_image)" + echo "${image%%/*}" +} + +# Repository of the pinned image, e.g. bci/nodejs +pinned_repository() { + local image name tag + image="$(pinned_image)" + tag="$(pinned_tag)" + name="${image%:"$tag"}" + echo "${name#*/}" +} + +# Version part of the tag, e.g. 24.18.1 out of 24.18.1-base +pinned_version() { + local tag version + tag="$(pinned_tag)" + version="${tag%%-*}" + + [ -n "$version" ] || die "the version in the $versions_file image tag is empty (tag: $tag). +An interpolated variable resolved to nothing; give it a default, as in \${NAME:-24.18.1}." + + echo "$version" +} + +# Flavour suffix of the tag, e.g. base out of 24.18.1-base, empty if there is none +pinned_flavour() { + local tag + tag="$(pinned_tag)" + + case "$tag" in + *-*) echo "${tag#*-}" ;; + *) echo "" ;; + esac +} + +# Version pinned for the local toolchain in .tool-versions. +tool_versions_version() { + [ -f "$tool_versions_file" ] || die "$tool_versions_file not found" + + local version + version="$(awk '$1 == "nodejs" { print $2; exit }' "$tool_versions_file")" + + [ -n "$version" ] || die "no 'nodejs' entry in $tool_versions_file" + echo "$version" +} + +# Newest X.Y.Z tag published for the pinned repository in the same flavour, +# ignoring the tags that carry a container build suffix such as 24.18.1-base-10.1. +latest_published_version() { + local registry repository flavour suffix pattern token tags newest + + registry="$(pinned_registry)" + repository="$(pinned_repository)" + flavour="$(pinned_flavour)" + + if [ -n "$flavour" ]; then + suffix="-$flavour" + else + suffix="" + fi + pattern="^[0-9]+\.[0-9]+\.[0-9]+${suffix}$" + + token="$(curl -fsSL \ + "https://scc.suse.com/api/registry/authorize?service=SUSE+Linux+Docker+Registry&scope=repository:${repository}:pull" | + sed -n 's/.*"token":"\([^"]*\)".*/\1/p')" + + [ -n "$token" ] || die "could not obtain a $registry pull token" + + tags="$(curl -fsSL -H "Authorization: Bearer $token" \ + "https://$registry/v2/$repository/tags/list" | + tr ',' '\n' | + sed -n 's/.*"\([0-9][^"]*\)".*/\1/p' | + grep -E "$pattern" | + sort -V)" + + [ -n "$tags" ] || die "no tags matching $pattern found for $repository" + + newest="$(echo "$tags" | tail -n 1)" + echo "${newest%%-*}" +} + +cmd_check() { + local image pinned tool_version actual status=0 + + image="$(pinned_image)" + pinned="$(pinned_version)" + tool_version="$(tool_versions_version)" + + echo "versions.yml: $image" + echo ".tool-versions: nodejs $tool_version" + + if [ "$pinned" != "$tool_version" ]; then + echo >&2 + echo "check-node-version: versions.yml and .tool-versions disagree" >&2 + echo " versions.yml pins: $pinned" >&2 + echo " .tool-versions pins: $tool_version" >&2 + echo "Set both to the same version, then rebuild the containers." >&2 + status=1 + fi + + if command -v node >/dev/null 2>&1; then + actual="$(node --version)" + actual="${actual#v}" + echo "running Node.js: $actual" + + if [ "$actual" != "$tool_version" ]; then + echo >&2 + echo "check-node-version: the running Node.js does not match the pin" >&2 + echo " pinned: $tool_version" >&2 + echo " running: $actual" >&2 + echo "Containers must use $image." >&2 + status=1 + fi + else + echo "running Node.js: not on PATH, runtime check skipped" + fi + + if [ "$status" -eq 0 ]; then + echo "check-node-version: OK" + fi + + return "$status" +} + +cmd_latest() { + local pinned newest registry repository flavour suffix + + pinned="$(pinned_version)" + newest="$(latest_published_version)" + registry="$(pinned_registry)" + repository="$(pinned_repository)" + flavour="$(pinned_flavour)" + + if [ -n "$flavour" ]; then + suffix="-$flavour" + else + suffix="" + fi + + echo "pinned: $pinned" + echo "latest: $newest ($registry/$repository:$newest$suffix)" + + if [ "$pinned" = "$newest" ]; then + echo "check-node-version: the pin is up to date" + else + echo "check-node-version: a newer version is available; update versions.yml and .tool-versions" + fi +} + +case "${1:-check}" in +check) cmd_check ;; +version) pinned_version ;; +image) pinned_image ;; +latest) cmd_latest ;; +*) die "unknown command '$1'; use check, version, image or latest" ;; +esac diff --git a/trento-docs-site-ui/.nvmrc b/trento-docs-site-ui/.nvmrc deleted file mode 100644 index a45fd52c..00000000 --- a/trento-docs-site-ui/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -24 diff --git a/versions.yml b/versions.yml new file mode 100644 index 00000000..3870c9a1 --- /dev/null +++ b/versions.yml @@ -0,0 +1,27 @@ +# SPDX-FileCopyrightText: SUSE LLC +# SPDX-License-Identifier: Apache-2.0 + +# Single source of truth for the Node.js image used by every container. +# +# It is shaped as a Compose file so that docker-compose.yml can import it +# directly with `extends`, which means the compose services cannot define a +# different image by accident. The CI workflows read the same value into their +# job container, so local previews and CI always run the same Node.js. +# +# The image below is the only place the registry, the repository, the version +# and the flavour are written down. scripts/check-node-version.sh derives +# everything from it: `check` verifies it against the nodejs entry in +# .tool-versions and against the running Node.js, and `latest` reports the +# newest matching tag published in registry.suse.com. +# +# Set CONTAINER_IMAGE_TAG to try another version without editing this file: +# +# CONTAINER_IMAGE_TAG=24.18.0 docker compose up trento-docs +# +# Note that ARG and ENV are Dockerfile directives; they are not valid here and +# Compose would refuse to load this file. Interpolation is the only mechanism +# Compose supports, and it reads the environment, never this file. +services: + node: + # Update the default version in the CONTAINER_IMAGE_TAG environment variable to align. + image: registry.suse.com/bci/nodejs:${CONTAINER_IMAGE_TAG:-24.18.1}-base From 2866d0cf7678d749831d3304c50e810b65b9497c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Oc=C3=B3n?= Date: Mon, 7 Sep 2026 13:04:46 +0200 Subject: [PATCH 2/2] Update to check that the node versions used are the same. As docker compose does not support ARG interpolation, we add a check to make sure everything is aligned --- .github/workflows/build-page.yaml | 1 + .github/workflows/extension-tests.yaml | 2 + scripts/check-node-version.sh | 94 +++++++++++++++++++++++--- versions.yml | 7 +- 4 files changed, 89 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build-page.yaml b/.github/workflows/build-page.yaml index 6b4206cb..2111a757 100644 --- a/.github/workflows/build-page.yaml +++ b/.github/workflows/build-page.yaml @@ -11,6 +11,7 @@ on: - 'trento-docs-site/**' - 'trento-docs-site-ui/build/ui-bundle.zip' - '.github/workflows/build-page.yaml' + - '.tool-versions' - 'versions.yml' - 'scripts/**' workflow_dispatch: diff --git a/.github/workflows/extension-tests.yaml b/.github/workflows/extension-tests.yaml index 937f4682..5178cbfe 100644 --- a/.github/workflows/extension-tests.yaml +++ b/.github/workflows/extension-tests.yaml @@ -12,6 +12,7 @@ on: - 'trento-docs-site/package-lock.json' - '.github/workflows/extension-tests.yaml' - 'versions.yml' + - '.tool-versions' - 'scripts/**' pull_request: @@ -22,6 +23,7 @@ on: - 'trento-docs-site/package-lock.json' - '.github/workflows/extension-tests.yaml' - 'versions.yml' + - '.tool-versions' - 'scripts/**' workflow_dispatch: diff --git a/scripts/check-node-version.sh b/scripts/check-node-version.sh index 1b89ac1c..cdba29ca 100755 --- a/scripts/check-node-version.sh +++ b/scripts/check-node-version.sh @@ -47,19 +47,93 @@ $offenders ARG and ENV are Dockerfile directives; use \${NAME:-default} interpolation instead." } -# Resolve Compose interpolation the way Compose does: an environment variable -# wins, otherwise the :- default written in the file is used. +# Resolve Compose interpolation exactly as Compose does, so this script can +# never report a different image from the one Compose would pull. +# +# $NAME the value, empty when unset +# ${NAME} the same +# ${NAME:-alt} NAME when non-empty, otherwise alt +# ${NAME-alt} NAME when set, even if empty, otherwise alt +# ${NAME:+alt} alt when NAME is non-empty, otherwise empty +# ${NAME+alt} alt when NAME is set, even if empty, otherwise empty +# ${NAME:?msg} NAME when non-empty, otherwise an error +# ${NAME?msg} NAME when set, even if empty, otherwise an error +# $$ a literal $ +# +# The colon matters: the :- and :+ forms treat a set-but-empty variable as +# empty, while - and + only ask whether the variable is set at all. +# +# The input is consumed once, left to right, appending to `out`. Two properties +# fall out of that and neither is optional: +# +# - $$ is recognised before the text after it is examined, so the {NAME} in +# $${NAME} stays literal instead of being read as a reference; +# - a substituted value is appended and never looked at again, so a variable +# whose value happens to contain ${...} is not expanded a second time. +# Compose does not re-expand either, and doing so would let the environment +# redirect which image is used. resolve_interpolation() { - local text="$1" name default value - - while [[ "$text" =~ \$\{([A-Za-z_][A-Za-z0-9_]*)(:?-([^}]*))?\} ]]; do - name="${BASH_REMATCH[1]}" - default="${BASH_REMATCH[3]}" - value="${!name:-$default}" - text="${text/"${BASH_REMATCH[0]}"/$value}" + local out="" rest="$1" literal match name op arg value resolved is_set + + while [ -n "$rest" ]; do + case "$rest" in + '$$'*) + out+='$' + rest="${rest:2}" + continue + ;; + '$'*) + if [[ "$rest" =~ ^\$\{([A-Za-z_][A-Za-z0-9_]*)(:?[-?+])?([^}]*)\} ]]; then + match="${BASH_REMATCH[0]}" + name="${BASH_REMATCH[1]}" + op="${BASH_REMATCH[2]}" + arg="${BASH_REMATCH[3]}" + elif [[ "$rest" =~ ^\$([A-Za-z_][A-Za-z0-9_]*) ]]; then + match="${BASH_REMATCH[0]}" + name="${BASH_REMATCH[1]}" + op="" + arg="" + else + die "malformed interpolation in $versions_file: $rest +Use \$NAME, \${NAME:-default} or \$\$ for a literal \$." + fi + ;; + *) + # Literal run up to the next $, which the branches above then handle. + literal="${rest%%\$*}" + out+="$literal" + rest="${rest#"$literal"}" + continue + ;; + esac + + if [ -n "${!name+set}" ]; then is_set=yes; else is_set=no; fi + value="${!name-}" + + case "$op" in + "") + [ -z "$arg" ] || die "unsupported interpolation in $versions_file: $match" + resolved="$value" + ;; + ":-") [ -n "$value" ] && resolved="$value" || resolved="$arg" ;; + "-") [ "$is_set" = yes ] && resolved="$value" || resolved="$arg" ;; + ":+") [ -n "$value" ] && resolved="$arg" || resolved="" ;; + "+") [ "$is_set" = yes ] && resolved="$arg" || resolved="" ;; + ":?") + [ -n "$value" ] || die "$name is unset or empty in $versions_file: ${arg:-required}" + resolved="$value" + ;; + "?") + [ "$is_set" = yes ] || die "$name is unset in $versions_file: ${arg:-required}" + resolved="$value" + ;; + esac + + out+="$resolved" + rest="${rest:${#match}}" done - echo "$text" + echo "$out" } # The single image reference in versions.yml, with interpolation applied. diff --git a/versions.yml b/versions.yml index 3870c9a1..75f42ee2 100644 --- a/versions.yml +++ b/versions.yml @@ -16,12 +16,9 @@ # # Set CONTAINER_IMAGE_TAG to try another version without editing this file: # -# CONTAINER_IMAGE_TAG=24.18.0 docker compose up trento-docs +# CONTAINER_IMAGE_TAG=24.18.0 podman compose up trento-docs # -# Note that ARG and ENV are Dockerfile directives; they are not valid here and -# Compose would refuse to load this file. Interpolation is the only mechanism -# Compose supports, and it reads the environment, never this file. services: node: - # Update the default version in the CONTAINER_IMAGE_TAG environment variable to align. + # Update the default version below for CONTAINER_IMAGE_TAG or an environment variable to update this. image: registry.suse.com/bci/nodejs:${CONTAINER_IMAGE_TAG:-24.18.1}-base