Handle docker server failures if others succeed

pull/719/head
Michael Shamoon 1 year ago
parent cac21ebd38
commit 6b90d3ef28

@ -52,7 +52,7 @@ export async function servicesResponse() {
discoveredServices = cleanServiceGroups(await servicesFromDocker()); discoveredServices = cleanServiceGroups(await servicesFromDocker());
} catch (e) { } catch (e) {
console.error("Failed to discover services, please check docker.yaml for errors or remove example entries."); console.error("Failed to discover services, please check docker.yaml for errors or remove example entries.");
if (e) console.error(e); if (e) console.error(e.toString());
discoveredServices = []; discoveredServices = [];
} }
@ -60,7 +60,7 @@ export async function servicesResponse() {
configuredServices = cleanServiceGroups(await servicesFromConfig()); configuredServices = cleanServiceGroups(await servicesFromConfig());
} catch (e) { } catch (e) {
console.error("Failed to load services.yaml, please check for errors"); console.error("Failed to load services.yaml, please check for errors");
if (e) console.error(e); if (e) console.error(e.toString());
configuredServices = []; configuredServices = [];
} }
@ -68,7 +68,7 @@ export async function servicesResponse() {
initialSettings = await getSettings(); initialSettings = await getSettings();
} catch (e) { } catch (e) {
console.error("Failed to load settings.yaml, please check for errors"); console.error("Failed to load settings.yaml, please check for errors");
if (e) console.error(e); if (e) console.error(e.toString());
initialSettings = {}; initialSettings = {};
} }

@ -44,39 +44,48 @@ export async function servicesFromDocker() {
const serviceServers = await Promise.all( const serviceServers = await Promise.all(
Object.keys(servers).map(async (serverName) => { Object.keys(servers).map(async (serverName) => {
const docker = new Docker(getDockerArguments(serverName).conn); try {
const containers = await docker.listContainers({ const docker = new Docker(getDockerArguments(serverName).conn);
all: true, const containers = await docker.listContainers({
}); all: true,
});
// bad docker connections can result in a <Buffer ...> object?
// in any case, this ensures the result is the expected array
if (!Array.isArray(containers)) {
return [];
}
const discovered = containers.map((container) => { // bad docker connections can result in a <Buffer ...> object?
let constructedService = null; // in any case, this ensures the result is the expected array
if (!Array.isArray(containers)) {
return [];
}
Object.keys(container.Labels).forEach((label) => { const discovered = containers.map((container) => {
if (label.startsWith("homepage.")) { let constructedService = null;
if (!constructedService) {
constructedService = { Object.keys(container.Labels).forEach((label) => {
container: container.Names[0].replace(/^\//, ""), if (label.startsWith("homepage.")) {
server: serverName, if (!constructedService) {
}; constructedService = {
container: container.Names[0].replace(/^\//, ""),
server: serverName,
};
}
shvl.set(constructedService, label.replace("homepage.", ""), container.Labels[label]);
} }
shvl.set(constructedService, label.replace("homepage.", ""), container.Labels[label]); });
}
});
return constructedService; return constructedService;
}); });
return { server: serverName, services: discovered.filter((filteredService) => filteredService) }; return { server: serverName, services: discovered.filter((filteredService) => filteredService) };
} catch (e) {
// a server failed, but others may succeed
return { server: serverName, services: [] };
}
}) })
); );
if (serviceServers.every(server => server.services.length === 0)) {
throw new Error('All docker servers failed to connect or returned no containers');
}
const mappedServiceGroups = []; const mappedServiceGroups = [];
serviceServers.forEach((server) => { serviceServers.forEach((server) => {

Loading…
Cancel
Save