From 48e70080c912ef6d9d346a24cd0109c53e89a2ec Mon Sep 17 00:00:00 2001 From: generalmat82 <110256073+generalmat82@users.noreply.github.com> Date: Tue, 18 Nov 2025 13:07:44 -0500 Subject: [PATCH 1/5] Add filter for containers with 'homarr.hide' label Filter out containers with 'homarr.hide' label when listing. From feat: #4428 --- packages/request-handler/src/docker.ts | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/request-handler/src/docker.ts b/packages/request-handler/src/docker.ts index cd82688d3d..5c597b607b 100644 --- a/packages/request-handler/src/docker.ts +++ b/packages/request-handler/src/docker.ts @@ -25,15 +25,16 @@ const extractImage = (container: ContainerInfo) => container.Image.split("/").at async function getContainersWithStatsAsync() { const containers = await Promise.all( - dockerInstances.map(async ({ instance, host }) => { - const instanceContainers = await instance.listContainers({ all: true }); - return instanceContainers.map((container) => ({ - ...container, - instance: host, - })); + dockerInstances.map(async ({ instance, host }) => { + const instanceContainers = await instance.listContainers({ all: true}); + return instanceContainers.map((container) => { + if (container.Labels.hasOwnProperty("homarr.hide")) { + return; + } + return ({...container,instance:host,}); + }); }), ).then((res) => res.flat()); - const likeQueries = containers.map((container) => like(icons.name, `%${extractImage(container)}%`)); const dbIcons = From b263360c9b0e3aba520edf8856fe6cfc1d66e736 Mon Sep 17 00:00:00 2001 From: generalmat82 <110256073+generalmat82@users.noreply.github.com> Date: Tue, 18 Nov 2025 13:37:23 -0500 Subject: [PATCH 2/5] fixed issue JS-0021 mentioned by @deepsource-io --- packages/request-handler/src/docker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/request-handler/src/docker.ts b/packages/request-handler/src/docker.ts index 5c597b607b..88b6b868a9 100644 --- a/packages/request-handler/src/docker.ts +++ b/packages/request-handler/src/docker.ts @@ -28,7 +28,7 @@ async function getContainersWithStatsAsync() { dockerInstances.map(async ({ instance, host }) => { const instanceContainers = await instance.listContainers({ all: true}); return instanceContainers.map((container) => { - if (container.Labels.hasOwnProperty("homarr.hide")) { + if (Object.prototype.hasOwnProperty.call(container.Labels, "homarr.hide")) { return; } return ({...container,instance:host,}); From 8949adc8d1098adcd9c063d3324ada8328ea0f5b Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Sat, 22 Nov 2025 10:39:18 +0100 Subject: [PATCH 3/5] refactor: replace relative import with package reference --- packages/request-handler/package.json | 1 + packages/request-handler/src/docker.ts | 6 +++--- pnpm-lock.yaml | 3 +++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/request-handler/package.json b/packages/request-handler/package.json index 8592069e19..4f12383651 100644 --- a/packages/request-handler/package.json +++ b/packages/request-handler/package.json @@ -26,6 +26,7 @@ "@homarr/common": "workspace:^0.1.0", "@homarr/db": "workspace:^0.1.0", "@homarr/definitions": "workspace:^0.1.0", + "@homarr/docker": "workspace:^0.1.0", "@homarr/integrations": "workspace:^0.1.0", "@homarr/log": "workspace:^0.1.0", "@homarr/redis": "workspace:^0.1.0", diff --git a/packages/request-handler/src/docker.ts b/packages/request-handler/src/docker.ts index 88b6b868a9..a5abdcfb02 100644 --- a/packages/request-handler/src/docker.ts +++ b/packages/request-handler/src/docker.ts @@ -3,9 +3,9 @@ import type { ContainerInfo, ContainerStats } from "dockerode"; import { db, like, or } from "@homarr/db"; import { icons } from "@homarr/db/schema"; +import type { ContainerState } from "@homarr/docker"; +import { DockerSingleton } from "@homarr/docker"; -import type { ContainerState } from "../../docker/src"; -import { DockerSingleton } from "../../docker/src"; import { createCachedWidgetRequestHandler } from "./lib/cached-widget-request-handler"; export const dockerContainersRequestHandler = createCachedWidgetRequestHandler({ @@ -25,7 +25,7 @@ const extractImage = (container: ContainerInfo) => container.Image.split("/").at async function getContainersWithStatsAsync() { const containers = await Promise.all( - dockerInstances.map(async ({ instance, host }) => { + dockerInstances.map(async ({ instance, host }) => { const instanceContainers = await instance.listContainers({ all: true}); return instanceContainers.map((container) => { if (Object.prototype.hasOwnProperty.call(container.Labels, "homarr.hide")) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3daa4d09fd..21055776d6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1895,6 +1895,9 @@ importers: '@homarr/definitions': specifier: workspace:^0.1.0 version: link:../definitions + '@homarr/docker': + specifier: workspace:^0.1.0 + version: link:../docker '@homarr/integrations': specifier: workspace:^0.1.0 version: link:../integrations From d130259e65767efcaf3a09f05dc8a7fa02f1a397 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Sat, 22 Nov 2025 10:41:03 +0100 Subject: [PATCH 4/5] refactor: replace map based filter with filter --- packages/request-handler/src/docker.ts | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/packages/request-handler/src/docker.ts b/packages/request-handler/src/docker.ts index a5abdcfb02..3893c783fe 100644 --- a/packages/request-handler/src/docker.ts +++ b/packages/request-handler/src/docker.ts @@ -25,14 +25,11 @@ const extractImage = (container: ContainerInfo) => container.Image.split("/").at async function getContainersWithStatsAsync() { const containers = await Promise.all( - dockerInstances.map(async ({ instance, host }) => { - const instanceContainers = await instance.listContainers({ all: true}); - return instanceContainers.map((container) => { - if (Object.prototype.hasOwnProperty.call(container.Labels, "homarr.hide")) { - return; - } - return ({...container,instance:host,}); - }); + dockerInstances.map(async ({ instance, host }) => { + const instanceContainers = await instance.listContainers({ all: true }); + return instanceContainers + .filter((container) => "homarr.hide" in container.Labels === false) + .map((container) => ({ ...container, instance: host })); }), ).then((res) => res.flat()); const likeQueries = containers.map((container) => like(icons.name, `%${extractImage(container)}%`)); From 28e767ca06d93a65ce7cc9d107649ab38f09e945 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Sat, 22 Nov 2025 10:41:50 +0100 Subject: [PATCH 5/5] refactor: extract docker-label definition to separate file --- packages/docker/src/index.ts | 1 + packages/docker/src/labels.ts | 4 ++++ packages/request-handler/src/docker.ts | 4 ++-- 3 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 packages/docker/src/labels.ts diff --git a/packages/docker/src/index.ts b/packages/docker/src/index.ts index 131507d6ab..bd8f5dc2a4 100644 --- a/packages/docker/src/index.ts +++ b/packages/docker/src/index.ts @@ -8,3 +8,4 @@ export type { Docker }; export const containerStates = ["created", "running", "paused", "restarting", "exited", "removing", "dead"] as const; export type ContainerState = (typeof containerStates)[number]; +export * from "./labels"; diff --git a/packages/docker/src/labels.ts b/packages/docker/src/labels.ts new file mode 100644 index 0000000000..84bf0071f0 --- /dev/null +++ b/packages/docker/src/labels.ts @@ -0,0 +1,4 @@ +export const dockerLabels = { + // Label to hide a container from Homarrs docker integration + hide: "homarr.hide", +} as const; diff --git a/packages/request-handler/src/docker.ts b/packages/request-handler/src/docker.ts index 3893c783fe..7a6d27be54 100644 --- a/packages/request-handler/src/docker.ts +++ b/packages/request-handler/src/docker.ts @@ -4,7 +4,7 @@ import type { ContainerInfo, ContainerStats } from "dockerode"; import { db, like, or } from "@homarr/db"; import { icons } from "@homarr/db/schema"; import type { ContainerState } from "@homarr/docker"; -import { DockerSingleton } from "@homarr/docker"; +import { dockerLabels, DockerSingleton } from "@homarr/docker"; import { createCachedWidgetRequestHandler } from "./lib/cached-widget-request-handler"; @@ -28,7 +28,7 @@ async function getContainersWithStatsAsync() { dockerInstances.map(async ({ instance, host }) => { const instanceContainers = await instance.listContainers({ all: true }); return instanceContainers - .filter((container) => "homarr.hide" in container.Labels === false) + .filter((container) => dockerLabels.hide in container.Labels === false) .map((container) => ({ ...container, instance: host })); }), ).then((res) => res.flat());