mirror of
https://github.com/ajnart/homarr.git
synced 2026-01-31 03:39:21 +01:00
54 lines
1.4 KiB
TypeScript
54 lines
1.4 KiB
TypeScript
import Docker from "dockerode";
|
|
|
|
import { env } from "./env";
|
|
|
|
export interface DockerInstance {
|
|
host: string;
|
|
instance: Docker;
|
|
}
|
|
|
|
export class DockerSingleton {
|
|
private static instances: DockerInstance[] | null = null;
|
|
|
|
private createInstances() {
|
|
const hostVariable = env.DOCKER_HOSTNAMES;
|
|
const portVariable = env.DOCKER_PORTS;
|
|
if (hostVariable === undefined || portVariable === undefined) {
|
|
return [{ host: "socket", instance: new Docker() }];
|
|
}
|
|
const hostnames = hostVariable.split(",");
|
|
const ports = portVariable.split(",");
|
|
|
|
if (hostnames.length !== ports.length) {
|
|
throw new Error("The number of hosts and ports must match");
|
|
}
|
|
|
|
return hostnames.map((host, i) => {
|
|
// Check above ensures that ports[i] is not undefined
|
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
const port = ports[i]!;
|
|
|
|
return {
|
|
host: `${host}:${port}`,
|
|
instance: new Docker({
|
|
host,
|
|
port: parseInt(port, 10),
|
|
}),
|
|
};
|
|
});
|
|
}
|
|
|
|
public static findInstance(host: string): DockerInstance | undefined {
|
|
return this.instances?.find((instance) => instance.host === host);
|
|
}
|
|
|
|
public static getInstances(): DockerInstance[] {
|
|
if (this.instances) {
|
|
return this.instances;
|
|
}
|
|
|
|
this.instances = new DockerSingleton().createInstances();
|
|
return this.instances;
|
|
}
|
|
}
|