coolify/apps/api/src/lib/docker.ts

96 lines
2.4 KiB
TypeScript
Raw Normal View History

2022-12-06 09:27:51 +00:00
import { executeCommand } from './common';
2022-07-25 18:43:53 +00:00
export function formatLabelsOnDocker(data) {
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 async function checkContainer({ dockerId, container, remove = false }: { dockerId: string, container: string, remove?: boolean }): Promise<{ found: boolean, status?: { isExited: boolean, isRunning: boolean, isRestarting: boolean } }> {
2022-07-06 09:02:36 +00:00
let containerFound = false;
try {
2022-12-06 09:27:51 +00:00
const { stdout } = await executeCommand({
2022-07-20 13:35:26 +00:00
dockerId,
command:
`docker inspect --format '{{json .State}}' ${container}`
});
containerFound = true
2022-07-06 09:02:36 +00:00
const parsedStdout = JSON.parse(stdout);
const status = parsedStdout.Status;
const isRunning = status === 'running';
const isRestarting = status === 'restarting'
const isExited = status === 'exited'
2022-07-06 09:02:36 +00:00
if (status === 'created') {
2022-12-06 09:27:51 +00:00
await executeCommand({
2022-07-20 13:35:26 +00:00
dockerId,
command:
`docker rm ${container}`
});
2022-07-06 09:02:36 +00:00
}
if (remove && status === 'exited') {
2022-12-06 09:27:51 +00:00
await executeCommand({
2022-07-20 13:35:26 +00:00
dockerId,
command:
`docker rm ${container}`
});
2022-07-06 09:02:36 +00:00
}
2022-12-01 11:58:45 +00:00
return {
found: containerFound,
status: {
isRunning,
isRestarting,
isExited
}
};
2022-07-06 09:02:36 +00:00
} catch (err) {
// Container not found
}
return {
found: false
};
2022-07-06 09:02:36 +00:00
}
2022-07-21 12:43:53 +00:00
export async function isContainerExited(dockerId: string, containerName: string): Promise<boolean> {
2022-07-06 09:02:36 +00:00
let isExited = false;
try {
2022-12-06 09:27:51 +00:00
const { stdout } = await executeCommand({ dockerId, command: `docker inspect -f '{{.State.Status}}' ${containerName}` })
2022-07-06 09:02:36 +00:00
if (stdout.trim() === 'exited') {
isExited = true;
}
} catch (error) {
//
}
return isExited;
}
export async function removeContainer({
id,
2022-07-20 13:35:26 +00:00
dockerId
2022-07-06 09:02:36 +00:00
}: {
id: string;
2022-07-20 13:35:26 +00:00
dockerId: string;
2022-07-06 09:02:36 +00:00
}): Promise<void> {
try {
2022-12-06 09:27:51 +00:00
const { stdout } = await executeCommand({ dockerId, command: `docker inspect --format '{{json .State}}' ${id}` })
2022-07-06 09:02:36 +00:00
if (JSON.parse(stdout).Running) {
2022-12-06 09:27:51 +00:00
await executeCommand({ dockerId, command: `docker stop -t 0 ${id}` })
await executeCommand({ dockerId, command: `docker rm ${id}` })
2022-07-06 09:02:36 +00:00
}
2022-10-12 10:02:47 +00:00
if (JSON.parse(stdout).Status === 'exited') {
2022-12-06 09:27:51 +00:00
await executeCommand({ dockerId, command: `docker rm ${id}` })
2022-10-12 10:02:47 +00:00
}
2022-07-06 09:02:36 +00:00
} catch (error) {
throw error;
}
}