Extracts docker conversion logic to own file, plus some other stuff
This commit is contained in:
20
src/Types.ts
20
src/Types.ts
@@ -80,3 +80,23 @@ export interface DockerHubResponse {
|
|||||||
content_types: string[]; // An array of supported content types for the repository
|
content_types: string[]; // An array of supported content types for the repository
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface DockerCompose {
|
||||||
|
version: string;
|
||||||
|
services: {
|
||||||
|
[serviceName: string]: {
|
||||||
|
image: string;
|
||||||
|
ports?: string[];
|
||||||
|
environment?: { [envVar: string]: string };
|
||||||
|
volumes?: string[];
|
||||||
|
restart?: string;
|
||||||
|
command?: string;
|
||||||
|
build?: string | { context: string; dockerfile?: string };
|
||||||
|
networks?: string[] | { [networkName: string]: { aliases?: string[] } };
|
||||||
|
depends_on?: string[];
|
||||||
|
labels?: { [labelName: string]: string };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
networks?: { [networkName: string]: {} };
|
||||||
|
volumes?: { [volumeName: string]: {} };
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<h2>Portainer Templates</h2>
|
<h2>Portainer Templates</h2>
|
||||||
</a>
|
</a>
|
||||||
<nav>
|
<nav>
|
||||||
<Button to="/">Home</Button>
|
<Button to="/" icon="whale">All Templates</Button>
|
||||||
<Button to={gitHubRepo} icon="github">GitHub</Button>
|
<Button to={gitHubRepo} icon="github">GitHub</Button>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
88
src/utils/template-to-docker-parser.ts
Normal file
88
src/utils/template-to-docker-parser.ts
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
|
||||||
|
import yaml from 'js-yaml';
|
||||||
|
import type { Template, Volume, Service, DockerCompose } from '$src/Types';
|
||||||
|
|
||||||
|
export const generateDockerRunCommand = (template: Template) => {
|
||||||
|
let command = `docker run -d \\ \n`;
|
||||||
|
if (template.ports) {
|
||||||
|
template.ports.forEach((port) => {
|
||||||
|
command += ` -p ${port} \\\n`;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (template.env) {
|
||||||
|
template.env.forEach((env) => {
|
||||||
|
command += ` -e ${env.name}=\${${env.name}} \\\n`;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (template.volumes) {
|
||||||
|
template.volumes.forEach((volume: Volume) => {
|
||||||
|
const readOnly = volume.readonly ? ":ro" : "";
|
||||||
|
command += ` -v ${volume.bind}:${volume.container}${readOnly} \\\n`;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (template.restart_policy) {
|
||||||
|
command += ` --restart=${template.restart_policy} \\\n`;
|
||||||
|
}
|
||||||
|
command += ` ${template.image}`;
|
||||||
|
return command;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const generateDockerRunCommands = (stack: Service[]) => {
|
||||||
|
const commands = stack.map((service) => {
|
||||||
|
let cmd = `docker run --name ${service.name} -d \\\n`;
|
||||||
|
if (service.command) {
|
||||||
|
cmd += ` ${service.command} \\\n`;
|
||||||
|
}
|
||||||
|
if (service.env) {
|
||||||
|
service.env.forEach((envVar) => {
|
||||||
|
cmd += ` -e "${envVar.value}" \\\n`;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (service.ports) {
|
||||||
|
service.ports.forEach((port) => {
|
||||||
|
cmd += ` -p ${port} \\\n`;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (service.volumes) {
|
||||||
|
service.volumes.forEach((volume) => {
|
||||||
|
cmd += ` -v ${volume.bind}:${volume.container} \\\n`;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (service.restart_policy) {
|
||||||
|
cmd += ` --restart=${service.restart_policy} \\\n`;
|
||||||
|
}
|
||||||
|
cmd += ` ${service.image}`;
|
||||||
|
return cmd;
|
||||||
|
});
|
||||||
|
return commands;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const convertToDockerCompose = (template: Template) => {
|
||||||
|
const serviceName = template.title.toLowerCase().replace(/[^a-z0-9]+/g, "-");
|
||||||
|
const dockerCompose: DockerCompose = {
|
||||||
|
version: "3.8",
|
||||||
|
services: { [serviceName]: { image: template.image } },
|
||||||
|
};
|
||||||
|
if (template.ports && template.ports.length > 0) {
|
||||||
|
dockerCompose.services[serviceName].ports = template.ports.map((port) => port.replace('/', ':'));
|
||||||
|
}
|
||||||
|
if (template.env && template.env.length > 0) {
|
||||||
|
dockerCompose.services[serviceName].environment = template.env.reduce((envVars, envVar) => {
|
||||||
|
envVars[envVar.name] = envVar.set || "";
|
||||||
|
return envVars;
|
||||||
|
}, {});
|
||||||
|
}
|
||||||
|
if (template.volumes && template.volumes.length > 0) {
|
||||||
|
dockerCompose.services[serviceName].volumes = template.volumes.map(
|
||||||
|
(volume) => `${volume.bind || ""}:${volume.container}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return yaml.dump(dockerCompose);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const convertPortainerStackToDockerCompose = (stack: Service[]) => {
|
||||||
|
const composeStack = stack.map(({ dockerStats, ...s }) => s);
|
||||||
|
return yaml.dump(composeStack);
|
||||||
|
};
|
||||||
|
|
||||||
Reference in New Issue
Block a user