You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
2.5 KiB
73 lines
2.5 KiB
5 months ago
|
import { getUsername } from "../server.js"
|
||
|
import { getActiveFlagImage } from "../queries/imageQueries.js"
|
||
|
import Docker from 'dockerode';
|
||
|
// create a new docker
|
||
|
const docker = new Docker();
|
||
|
|
||
|
// creating container
|
||
|
async function CreateContainer(email) {
|
||
|
console.log('Creating Container for ' + email);
|
||
|
let username = getUsername(email);
|
||
|
|
||
|
// get the active flag image for that user and use that to create the container
|
||
|
return getActiveFlagImage(email).then(async (image) => {
|
||
|
if(image === undefined || image.ActiveFlag === null || image.ActiveFlag === 'ubuntu') {
|
||
|
return await StartContainer('ubuntu', username, email);
|
||
|
}
|
||
|
else
|
||
|
return await StartContainer(image.ActiveFlag, username, email);
|
||
|
}).catch((err) => {
|
||
|
console.error('Error in CreateContainer:', err.message);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// Create and Start the container with correct image
|
||
|
async function StartContainer(image, username, email) {
|
||
|
|
||
|
// create container
|
||
|
try {
|
||
|
const container = await docker.createContainer({
|
||
|
Image: image,
|
||
|
Cmd: ['/bin/bash'],
|
||
|
AttachStdin: true,
|
||
|
AttachStdout: true,
|
||
|
AttachStderr: true,
|
||
|
StdinOnce: false,
|
||
|
OpenStdin: true,
|
||
|
Tty: true,
|
||
|
Detach: false,
|
||
|
Hostname: username,
|
||
|
name: username
|
||
|
});
|
||
|
|
||
|
// start container
|
||
|
console.log('starting container', container.id);
|
||
|
await container.start();
|
||
|
console.log('+++++ Container started for ' + username + ' with ID: ' + container.id + ' +++++');
|
||
|
return container;
|
||
|
} catch (err) {
|
||
|
if (err.statusCode === 409 || err.statusCode === 404) { // confliction or if container doesn't exist
|
||
|
return CheckContainer(email);
|
||
|
}
|
||
|
else console.error(err);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// check if there is a container already created and started with the specific email
|
||
|
export async function CheckContainer(email) {
|
||
|
try { // remove container if that container already exists
|
||
|
console.log('Checking container for email:', email);
|
||
|
const cont = await docker.getContainer(getUsername(email));
|
||
|
const info = await cont.inspect();
|
||
|
if(info.State.Running){
|
||
|
await cont.kill();
|
||
|
await cont.remove({ force: true});
|
||
|
}
|
||
|
return await CreateContainer(email);
|
||
|
} catch(err) {
|
||
|
if(err.statusCode === 404) {
|
||
|
return await CreateContainer(email);
|
||
|
}
|
||
|
console.error('Error checking container:', err.message);
|
||
|
}
|
||
|
};
|