Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c279dbd55e | |||
| 7b7064864e | |||
| 36f06cef09 | |||
| b0f87deb4b |
14
changelog.md
14
changelog.md
@@ -1,5 +1,19 @@
|
|||||||
# Changelog
|
# 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
|
||||||
|
|
||||||
|
- Added top-level import: import * as fs from 'fs' in ts/classes.dockerfile.ts
|
||||||
|
- Removed inline require('fs') calls and replaced with the imported fs in constructor and test() to keep imports consistent
|
||||||
|
- No behavioral change expected; this is a cleanup/refactor to standardize module usage
|
||||||
|
|
||||||
## 2026-01-20 - 1.4.1 - fix(docs)
|
## 2026-01-20 - 1.4.1 - fix(docs)
|
||||||
update README: expand usage, installation, quick start, features, troubleshooting and migration notes
|
update README: expand usage, installation, quick start, features, troubleshooting and migration notes
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@git.zone/tsdocker",
|
"name": "@git.zone/tsdocker",
|
||||||
"version": "1.4.1",
|
"version": "1.4.3",
|
||||||
"private": false,
|
"private": false,
|
||||||
"description": "develop npm modules cross platform with docker",
|
"description": "develop npm modules cross platform with docker",
|
||||||
"main": "dist_ts/index.js",
|
"main": "dist_ts/index.js",
|
||||||
|
|||||||
@@ -3,6 +3,6 @@
|
|||||||
*/
|
*/
|
||||||
export const commitinfo = {
|
export const commitinfo = {
|
||||||
name: '@git.zone/tsdocker',
|
name: '@git.zone/tsdocker',
|
||||||
version: '1.4.1',
|
version: '1.4.3',
|
||||||
description: 'develop npm modules cross platform with docker'
|
description: 'develop npm modules cross platform with docker'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import { logger } from './tsdocker.logging.js';
|
|||||||
import { DockerRegistry } from './classes.dockerregistry.js';
|
import { DockerRegistry } from './classes.dockerregistry.js';
|
||||||
import type { IDockerfileOptions, ITsDockerConfig } from './interfaces/index.js';
|
import type { IDockerfileOptions, ITsDockerConfig } from './interfaces/index.js';
|
||||||
import type { TsDockerManager } from './classes.tsdockermanager.js';
|
import type { TsDockerManager } from './classes.tsdockermanager.js';
|
||||||
|
import * as fs from 'fs';
|
||||||
|
|
||||||
const smartshellInstance = new plugins.smartshell.Smartshell({
|
const smartshellInstance = new plugins.smartshell.Smartshell({
|
||||||
executor: 'bash',
|
executor: 'bash',
|
||||||
@@ -57,9 +58,14 @@ export class Dockerfile {
|
|||||||
const dependencies: Dockerfile[] = [];
|
const dependencies: Dockerfile[] = [];
|
||||||
const baseImage = dockerfile.baseImage;
|
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
|
// Check if the baseImage is among the local Dockerfiles
|
||||||
if (tagToDockerfile.has(baseImage)) {
|
if (tagToDockerfile.has(baseImageKey)) {
|
||||||
const baseDockerfile = tagToDockerfile.get(baseImage)!;
|
const baseDockerfile = tagToDockerfile.get(baseImageKey)!;
|
||||||
dependencies.push(baseDockerfile);
|
dependencies.push(baseDockerfile);
|
||||||
dockerfile.localBaseImageDependent = true;
|
dockerfile.localBaseImageDependent = true;
|
||||||
dockerfile.localBaseDockerfile = baseDockerfile;
|
dockerfile.localBaseDockerfile = baseDockerfile;
|
||||||
@@ -115,8 +121,10 @@ export class Dockerfile {
|
|||||||
public static async mapDockerfiles(sortedDockerfileArray: Dockerfile[]): Promise<Dockerfile[]> {
|
public static async mapDockerfiles(sortedDockerfileArray: Dockerfile[]): Promise<Dockerfile[]> {
|
||||||
sortedDockerfileArray.forEach((dockerfileArg) => {
|
sortedDockerfileArray.forEach((dockerfileArg) => {
|
||||||
if (dockerfileArg.localBaseImageDependent) {
|
if (dockerfileArg.localBaseImageDependent) {
|
||||||
|
// Extract repo:version from baseImage for comparison with cleanTag
|
||||||
|
const baseImageKey = Dockerfile.extractRepoVersion(dockerfileArg.baseImage);
|
||||||
sortedDockerfileArray.forEach((dockfile2: Dockerfile) => {
|
sortedDockerfileArray.forEach((dockfile2: Dockerfile) => {
|
||||||
if (dockfile2.cleanTag === dockerfileArg.baseImage) {
|
if (dockfile2.cleanTag === baseImageKey) {
|
||||||
dockerfileArg.localBaseDockerfile = dockfile2;
|
dockerfileArg.localBaseDockerfile = dockfile2;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -230,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
|
* Returns the docker tag string for a given registry and repo
|
||||||
*/
|
*/
|
||||||
@@ -314,7 +350,6 @@ export class Dockerfile {
|
|||||||
this.containerName = 'dockerfile-' + this.version;
|
this.containerName = 'dockerfile-' + this.version;
|
||||||
|
|
||||||
if (options.filePath && options.read) {
|
if (options.filePath && options.read) {
|
||||||
const fs = require('fs');
|
|
||||||
this.content = fs.readFileSync(plugins.path.resolve(options.filePath), 'utf-8');
|
this.content = fs.readFileSync(plugins.path.resolve(options.filePath), 'utf-8');
|
||||||
} else if (options.fileContents) {
|
} else if (options.fileContents) {
|
||||||
this.content = options.fileContents;
|
this.content = options.fileContents;
|
||||||
@@ -419,7 +454,6 @@ export class Dockerfile {
|
|||||||
const testDir = this.managerRef.config.testDir || plugins.path.join(paths.cwd, 'test');
|
const testDir = this.managerRef.config.testDir || plugins.path.join(paths.cwd, 'test');
|
||||||
const testFile = plugins.path.join(testDir, 'test_' + this.version + '.sh');
|
const testFile = plugins.path.join(testDir, 'test_' + this.version + '.sh');
|
||||||
|
|
||||||
const fs = require('fs');
|
|
||||||
const testFileExists = fs.existsSync(testFile);
|
const testFileExists = fs.existsSync(testFile);
|
||||||
|
|
||||||
if (testFileExists) {
|
if (testFileExists) {
|
||||||
|
|||||||
Reference in New Issue
Block a user