From 7b7064864e76c0e78f65bd4b3526777a6fa47fca Mon Sep 17 00:00:00 2001 From: Juergen Kunz Date: Wed, 4 Feb 2026 14:01:57 +0000 Subject: [PATCH] fix(dockerfile): fix matching of base images to local Dockerfiles by stripping registry prefixes when comparing image references --- changelog.md | 7 +++++++ ts/00_commitinfo_data.ts | 2 +- ts/classes.dockerfile.ts | 41 +++++++++++++++++++++++++++++++++++++--- 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/changelog.md b/changelog.md index feac4cc..c8b0549 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,12 @@ # Changelog +## 2026-02-04 - 1.4.3 - fix(dockerfile) +fix matching of base images to local Dockerfiles by stripping registry prefixes when comparing image references + +- Added Dockerfile.extractRepoVersion(imageRef) to normalize image references by removing registry prefixes (detects registries containing '.' or ':' or 'localhost'). +- Use extractRepoVersion when checking tagToDockerfile and when mapping local base dockerfiles to ensure comparisons use repo:tag keys rather than full registry-prefixed references. +- Prevents mismatches when baseImage includes a registry (e.g. "host.today/repo:version") so it correctly matches a local cleanTag like "repo:version". + ## 2026-01-21 - 1.4.2 - fix(classes.dockerfile) use a single top-level fs import instead of requiring fs inside methods diff --git a/ts/00_commitinfo_data.ts b/ts/00_commitinfo_data.ts index 60424c9..7aef705 100644 --- a/ts/00_commitinfo_data.ts +++ b/ts/00_commitinfo_data.ts @@ -3,6 +3,6 @@ */ export const commitinfo = { name: '@git.zone/tsdocker', - version: '1.4.2', + version: '1.4.3', description: 'develop npm modules cross platform with docker' } diff --git a/ts/classes.dockerfile.ts b/ts/classes.dockerfile.ts index e935e3c..9346f1d 100644 --- a/ts/classes.dockerfile.ts +++ b/ts/classes.dockerfile.ts @@ -58,9 +58,14 @@ export class Dockerfile { const dependencies: Dockerfile[] = []; const baseImage = dockerfile.baseImage; + // Extract repo:version from baseImage for comparison with cleanTag + // baseImage may include a registry prefix (e.g., "host.today/repo:version") + // but cleanTag is just "repo:version", so we strip the registry prefix + const baseImageKey = Dockerfile.extractRepoVersion(baseImage); + // Check if the baseImage is among the local Dockerfiles - if (tagToDockerfile.has(baseImage)) { - const baseDockerfile = tagToDockerfile.get(baseImage)!; + if (tagToDockerfile.has(baseImageKey)) { + const baseDockerfile = tagToDockerfile.get(baseImageKey)!; dependencies.push(baseDockerfile); dockerfile.localBaseImageDependent = true; dockerfile.localBaseDockerfile = baseDockerfile; @@ -116,8 +121,10 @@ export class Dockerfile { public static async mapDockerfiles(sortedDockerfileArray: Dockerfile[]): Promise { sortedDockerfileArray.forEach((dockerfileArg) => { if (dockerfileArg.localBaseImageDependent) { + // Extract repo:version from baseImage for comparison with cleanTag + const baseImageKey = Dockerfile.extractRepoVersion(dockerfileArg.baseImage); sortedDockerfileArray.forEach((dockfile2: Dockerfile) => { - if (dockfile2.cleanTag === dockerfileArg.baseImage) { + if (dockfile2.cleanTag === baseImageKey) { dockerfileArg.localBaseDockerfile = dockfile2; } }); @@ -231,6 +238,34 @@ export class Dockerfile { }); } + /** + * Extracts the repo:version part from a full image reference, stripping any registry prefix. + * Examples: + * "registry.example.com/repo:version" -> "repo:version" + * "repo:version" -> "repo:version" + * "host.today/ht-docker-node:npmci" -> "ht-docker-node:npmci" + */ + private static extractRepoVersion(imageRef: string): string { + const parts = imageRef.split('/'); + if (parts.length === 1) { + // No registry prefix: "repo:version" + return imageRef; + } + + // Check if first part looks like a registry (contains '.' or ':' or is 'localhost') + const firstPart = parts[0]; + const looksLikeRegistry = + firstPart.includes('.') || firstPart.includes(':') || firstPart === 'localhost'; + + if (looksLikeRegistry) { + // Strip registry: "registry.example.com/repo:version" -> "repo:version" + return parts.slice(1).join('/'); + } + + // No registry prefix, could be "org/repo:version" + return imageRef; + } + /** * Returns the docker tag string for a given registry and repo */