mirror of
https://github.com/tiennm99/coolify.git
synced 2026-05-06 15:35:39 +00:00
158 lines
3.5 KiB
TypeScript
158 lines
3.5 KiB
TypeScript
import { executeCommand } from './executeCommand';
|
|
|
|
export async function checkContainer({
|
|
dockerId,
|
|
container,
|
|
remove = false
|
|
}: {
|
|
dockerId: string;
|
|
container: string;
|
|
remove?: boolean;
|
|
}): Promise<{
|
|
found: boolean;
|
|
status?: { isExited: boolean; isRunning: boolean; isRestarting: boolean };
|
|
}> {
|
|
let containerFound = false;
|
|
try {
|
|
const { stdout } = await executeCommand({
|
|
dockerId,
|
|
command: `docker inspect --format '{{json .State}}' ${container}`
|
|
});
|
|
containerFound = true;
|
|
const parsedStdout = JSON.parse(stdout);
|
|
const status = parsedStdout.Status;
|
|
const isRunning = status === 'running';
|
|
const isRestarting = status === 'restarting';
|
|
const isExited = status === 'exited';
|
|
if (status === 'created') {
|
|
await executeCommand({
|
|
dockerId,
|
|
command: `docker rm ${container}`
|
|
});
|
|
}
|
|
if (remove && status === 'exited') {
|
|
await executeCommand({
|
|
dockerId,
|
|
command: `docker rm ${container}`
|
|
});
|
|
}
|
|
|
|
return {
|
|
found: containerFound,
|
|
status: {
|
|
isRunning,
|
|
isRestarting,
|
|
isExited
|
|
}
|
|
};
|
|
} catch (err) {
|
|
// Container not found
|
|
}
|
|
return {
|
|
found: false
|
|
};
|
|
}
|
|
|
|
export async function removeContainer({
|
|
id,
|
|
dockerId
|
|
}: {
|
|
id: string;
|
|
dockerId: string;
|
|
}): Promise<void> {
|
|
try {
|
|
const { stdout } = await executeCommand({
|
|
dockerId,
|
|
command: `docker inspect --format '{{json .State}}' ${id}`
|
|
});
|
|
if (JSON.parse(stdout).Running) {
|
|
await executeCommand({ dockerId, command: `docker stop -t 0 ${id}` });
|
|
await executeCommand({ dockerId, command: `docker rm ${id}` });
|
|
}
|
|
if (JSON.parse(stdout).Status === 'exited') {
|
|
await executeCommand({ dockerId, command: `docker rm ${id}` });
|
|
}
|
|
} catch (error) {
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
export async function stopDatabaseContainer(database: any): Promise<boolean> {
|
|
let everStarted = false;
|
|
const {
|
|
id,
|
|
destinationDockerId,
|
|
destinationDocker: { engine, id: dockerId }
|
|
} = database;
|
|
if (destinationDockerId) {
|
|
try {
|
|
const { stdout } = await executeCommand({
|
|
dockerId,
|
|
command: `docker inspect --format '{{json .State}}' ${id}`
|
|
});
|
|
|
|
if (stdout) {
|
|
everStarted = true;
|
|
await removeContainer({ id, dockerId });
|
|
}
|
|
} catch (error) {
|
|
//
|
|
}
|
|
}
|
|
return everStarted;
|
|
}
|
|
export async function stopTcpHttpProxy(
|
|
id: string,
|
|
destinationDocker: any,
|
|
publicPort: number,
|
|
forceName: string | null = null
|
|
): Promise<{ stdout: string; stderr: string } | Error | unknown> {
|
|
const { id: dockerId } = destinationDocker;
|
|
let container = `${id}-${publicPort}`;
|
|
if (forceName) container = forceName;
|
|
const { found } = await checkContainer({ dockerId, container });
|
|
try {
|
|
if (!found) return true;
|
|
return await executeCommand({
|
|
dockerId,
|
|
command: `docker stop -t 0 ${container} && docker rm ${container}`,
|
|
shell: true
|
|
});
|
|
} catch (error) {
|
|
return error;
|
|
}
|
|
}
|
|
|
|
export function formatLabelsOnDocker(data: any) {
|
|
return data
|
|
.trim()
|
|
.split('\n')
|
|
.map((a) => JSON.parse(a))
|
|
.map((container) => {
|
|
const labels = container.Labels.split(',');
|
|
let jsonLabels = {};
|
|
labels.forEach((l) => {
|
|
const name = l.split('=')[0];
|
|
const value = l.split('=')[1];
|
|
jsonLabels = { ...jsonLabels, ...{ [name]: value } };
|
|
});
|
|
container.Labels = jsonLabels;
|
|
return container;
|
|
});
|
|
}
|
|
|
|
export function defaultComposeConfiguration(network: string): any {
|
|
return {
|
|
networks: [network],
|
|
restart: 'on-failure',
|
|
deploy: {
|
|
restart_policy: {
|
|
condition: 'on-failure',
|
|
delay: '5s',
|
|
max_attempts: 10,
|
|
window: '120s'
|
|
}
|
|
}
|
|
};
|
|
}
|