diff --git a/.changeset/fix-dockerignore-validation.md b/.changeset/fix-dockerignore-validation.md new file mode 100644 index 0000000..1630b6e --- /dev/null +++ b/.changeset/fix-dockerignore-validation.md @@ -0,0 +1,5 @@ +--- +"@docker-doctor/cli": patch +--- + +Fix workspace discovery to correctly track and validate `.dockerignore` files, resolving false-positive warnings in the `useDockerignore` performance rule. diff --git a/packages/core/src/project-info/discover.ts b/packages/core/src/project-info/discover.ts index afd69a5..7a2dfa8 100644 --- a/packages/core/src/project-info/discover.ts +++ b/packages/core/src/project-info/discover.ts @@ -36,10 +36,15 @@ export const discoverProject = async ( const allFiles = await walk(rootDir); const dockerfiles: string[] = []; const composeFiles: string[] = []; + const dockerignores: string[] = []; for (const file of allFiles) { const base = path.basename(file).toLowerCase(); + if (base === ".dockerignore") { + dockerignores.push(path.relative(rootDir, file)); + } + // Match Dockerfile, Dockerfile.*, *.dockerfile if ( base === "dockerfile" || @@ -65,5 +70,6 @@ export const discoverProject = async ( return { composeFiles, dockerfiles, + dockerignores, }; }; diff --git a/packages/core/src/types/index.ts b/packages/core/src/types/index.ts index a33267a..eec85e7 100644 --- a/packages/core/src/types/index.ts +++ b/packages/core/src/types/index.ts @@ -18,6 +18,7 @@ export interface Diagnostic { export interface ProjectInfo { dockerfiles: string[]; composeFiles: string[]; + dockerignores?: string[]; } export interface DiagnoseResult { diff --git a/packages/docker-doctor/src/cli.ts b/packages/docker-doctor/src/cli.ts index 5acabe0..ff76aeb 100644 --- a/packages/docker-doctor/src/cli.ts +++ b/packages/docker-doctor/src/cli.ts @@ -338,6 +338,25 @@ const runRulesEngine = async ( return diagnostics; }; +const filterDiagnostics = ( + diagnostics: Diagnostic[], + categories?: Record +): Diagnostic[] => { + if (!categories) { + return diagnostics; + } + return diagnostics.filter((d) => { + const ruleDef = findRule(d.rule); + if (ruleDef) { + const catSeverity = categories[ruleDef.category]; + if (catSeverity === "off") { + return false; + } + } + return true; + }); +}; + const program = new Command(); program @@ -417,6 +436,7 @@ program const projectFilesList = [ ...project.dockerfiles, ...project.composeFiles, + ...(project.dockerignores || []), ]; const diagnostics = await runRulesEngine( @@ -430,19 +450,10 @@ program ); // Filter by category config if needed - let filteredDiagnostics = diagnostics; - if (config.categories) { - filteredDiagnostics = diagnostics.filter((d) => { - const ruleDef = findRule(d.rule); - if (ruleDef) { - const catSeverity = config.categories?.[ruleDef.category]; - if (catSeverity === "off") { - return false; - } - } - return true; - }); - } + const filteredDiagnostics = filterDiagnostics( + diagnostics, + config.categories + ); // Calculate score const { score, label } = calculateScore(filteredDiagnostics);