mirror of https://github.com/docker/docs.git
Refactored image code.
This commit is contained in:
parent
72271a3d20
commit
3d615fd776
|
@ -197,27 +197,14 @@
|
||||||
"removeAppWatcher": true,
|
"removeAppWatcher": true,
|
||||||
"addAppWatcher": true,
|
"addAppWatcher": true,
|
||||||
"resolveWatchers": true,
|
"resolveWatchers": true,
|
||||||
"createTarFile": true,
|
|
||||||
"createTarFileSync": true,
|
|
||||||
"deleteImage": true,
|
|
||||||
"checkDefaultImages": true,
|
"checkDefaultImages": true,
|
||||||
"resolveDefaultImages": true,
|
"resolveDefaultImages": true,
|
||||||
"checkDefaultContainers": true,
|
"checkDefaultContainers": true,
|
||||||
"resolveDefaultContainers": true,
|
"resolveDefaultContainers": true,
|
||||||
"killAndRemoveContainers": true,
|
"killAndRemoveContainers": true,
|
||||||
"deleteImageSync": true,
|
|
||||||
"upContainers": true,
|
"upContainers": true,
|
||||||
"reloadDefaultContainers": true,
|
"reloadDefaultContainers": true,
|
||||||
"removeImages": true,
|
"removeImages": true,
|
||||||
"pullImageFromDockerfile": true,
|
|
||||||
"buildImage": true,
|
|
||||||
"getImageMetaData": true,
|
|
||||||
"getImageJSON": true,
|
|
||||||
"rebuildImage": true,
|
|
||||||
"saveImageFolderSync": true,
|
|
||||||
"rebuildImageSync": true,
|
|
||||||
"saveImageFolder": true,
|
|
||||||
"getFromImage": true,
|
|
||||||
|
|
||||||
// Forms
|
// Forms
|
||||||
"showFormErrors": true,
|
"showFormErrors": true,
|
||||||
|
|
|
@ -91,3 +91,43 @@ Images.allow({
|
||||||
});
|
});
|
||||||
|
|
||||||
Images.attachSchema(schemaImages);
|
Images.attachSchema(schemaImages);
|
||||||
|
|
||||||
|
Images.after.insert(function (userId, image) {
|
||||||
|
var imageId = this._id;
|
||||||
|
var imagePath = path.join(KITE_IMAGES_PATH, imageId);
|
||||||
|
Images.update(imageId, {
|
||||||
|
$set: {
|
||||||
|
path: imagePath
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (image.meta.logo) {
|
||||||
|
Images.update(imageId, {
|
||||||
|
$set: {
|
||||||
|
logoPath: path.join(imagePath, image.meta.logo)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
image = Images.findOne(imageId);
|
||||||
|
Images.saveFolderSync(image.originPath, imageId);
|
||||||
|
Images.pull(fs.readFileSync(path.join(image.path, 'Dockerfile'), 'utf8'), imageId, function (err) {
|
||||||
|
if (err) { throw err; }
|
||||||
|
Images.build(image, function (err) {
|
||||||
|
if (err) { console.error(err); }
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
Images.after.remove(function (userId, image) {
|
||||||
|
if (image.docker) {
|
||||||
|
try {
|
||||||
|
Docker.removeImageSync(image.docker.Id);
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Util.deleteFolder(image.path);
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
createTarFile = function (image, callback) {
|
var createTarFile = function (image, callback) {
|
||||||
var TAR_PATH = path.join(KITE_TAR_PATH, image._id + '.tar');
|
var TAR_PATH = path.join(KITE_TAR_PATH, image._id + '.tar');
|
||||||
exec('tar czf ' + TAR_PATH + ' -C ' + image.path + ' .', function (err) {
|
exec('tar czf ' + TAR_PATH + ' -C ' + image.path + ' .', function (err) {
|
||||||
if (err) { callback(err, null); return; }
|
if (err) { callback(err, null); return; }
|
||||||
|
@ -7,11 +7,11 @@ createTarFile = function (image, callback) {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
createTarFileSync = function (image) {
|
var createTarFileSync = function (image) {
|
||||||
return Meteor._wrapAsync(createTarFile)(image);
|
return Meteor._wrapAsync(createTarFile)(image);
|
||||||
};
|
};
|
||||||
|
|
||||||
getFromImage = function (dockerfile) {
|
var getFromImage = function (dockerfile) {
|
||||||
var patternString = "(FROM)(.*)";
|
var patternString = "(FROM)(.*)";
|
||||||
var regex = new RegExp(patternString, "g");
|
var regex = new RegExp(patternString, "g");
|
||||||
var fromInstruction = dockerfile.match(regex);
|
var fromInstruction = dockerfile.match(regex);
|
||||||
|
@ -22,7 +22,7 @@ getFromImage = function (dockerfile) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
getImageJSON = function (directory) {
|
var getImageJSON = function (directory) {
|
||||||
var KITE_JSON_PATH = path.join(directory, 'image.json');
|
var KITE_JSON_PATH = path.join(directory, 'image.json');
|
||||||
if (fs.existsSync(KITE_JSON_PATH)) {
|
if (fs.existsSync(KITE_JSON_PATH)) {
|
||||||
var data = fs.readFileSync(KITE_JSON_PATH, 'utf8');
|
var data = fs.readFileSync(KITE_JSON_PATH, 'utf8');
|
||||||
|
@ -32,23 +32,7 @@ getImageJSON = function (directory) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
saveImageFolder = function (directory, imageId, callback) {
|
var getImageMetaData = function (directory) {
|
||||||
var destinationPath = path.join(KITE_IMAGES_PATH, imageId);
|
|
||||||
if (!fs.existsSync(destinationPath)) {
|
|
||||||
fs.mkdirSync(destinationPath, function (err) {
|
|
||||||
if (err) { callback(err); return; }
|
|
||||||
});
|
|
||||||
Util.copyFolder(directory, destinationPath);
|
|
||||||
console.log('Copied image folder for: ' + imageId);
|
|
||||||
callback(null);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
saveImageFolderSync = function (directory, imageId) {
|
|
||||||
return Meteor._wrapAsync(saveImageFolder)(directory, imageId);
|
|
||||||
};
|
|
||||||
|
|
||||||
getImageMetaData = function (directory) {
|
|
||||||
var kiteJSON = getImageJSON(directory);
|
var kiteJSON = getImageJSON(directory);
|
||||||
if (kiteJSON) {
|
if (kiteJSON) {
|
||||||
if (!kiteJSON.name) {
|
if (!kiteJSON.name) {
|
||||||
|
@ -62,24 +46,23 @@ getImageMetaData = function (directory) {
|
||||||
return kiteJSON;
|
return kiteJSON;
|
||||||
};
|
};
|
||||||
|
|
||||||
deleteImage = function (image, callback) {
|
Images.saveFolder = function (directory, imageId, callback) {
|
||||||
if (!image.docker) {
|
var destinationPath = path.join(KITE_IMAGES_PATH, imageId);
|
||||||
callback(null, {});
|
if (!fs.existsSync(destinationPath)) {
|
||||||
return;
|
fs.mkdirSync(destinationPath, function (err) {
|
||||||
|
if (err) { callback(err); return; }
|
||||||
|
});
|
||||||
|
Util.copyFolder(directory, destinationPath);
|
||||||
|
console.log('Copied image folder for: ' + imageId);
|
||||||
|
callback(null);
|
||||||
}
|
}
|
||||||
try {
|
|
||||||
Docker.removeImageSync(image.docker.Id);
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e);
|
|
||||||
}
|
|
||||||
callback(null);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
deleteImageSync = function (image) {
|
Images.saveFolderSync = function (directory, imageId) {
|
||||||
return Meteor._wrapAsync(deleteImage)(image);
|
return Meteor._wrapAsync(Images.saveFolder)(directory, imageId);
|
||||||
};
|
};
|
||||||
|
|
||||||
rebuildImage = function (image, callback) {
|
Images.rebuild = function (image, callback) {
|
||||||
Util.deleteFolder(image.path);
|
Util.deleteFolder(image.path);
|
||||||
var imageMetaData = getImageMetaData(image.originPath);
|
var imageMetaData = getImageMetaData(image.originPath);
|
||||||
if (imageMetaData.logo) {
|
if (imageMetaData.logo) {
|
||||||
|
@ -102,21 +85,21 @@ rebuildImage = function (image, callback) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
image = Images.findOne(image._id);
|
image = Images.findOne(image._id);
|
||||||
saveImageFolderSync(image.originPath, image._id);
|
Images.saveFolderSync(image.originPath, image._id);
|
||||||
pullImageFromDockerfile(fs.readFileSync(path.join(image.path, 'Dockerfile'), 'utf8'), image._id, function (err) {
|
Images.pull(fs.readFileSync(path.join(image.path, 'Dockerfile'), 'utf8'), image._id, function (err) {
|
||||||
if (err) { callback(err, null); return; }
|
if (err) { callback(err, null); return; }
|
||||||
buildImage(image, function (err) {
|
Images.build(image, function (err) {
|
||||||
if (err) { console.error(err); }
|
if (err) { console.error(err); }
|
||||||
callback(null, null);
|
callback(null, null);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
rebuildImageSync = function (image) {
|
Images.rebuildSync = function (image) {
|
||||||
return Meteor._wrapAsync(rebuildImage)(image);
|
return Meteor._wrapAsync(Images.rebuild)(image);
|
||||||
};
|
};
|
||||||
|
|
||||||
pullImageFromDockerfile = function (dockerfile, imageId, callback) {
|
Images.pull = function (dockerfile, imageId, callback) {
|
||||||
var fromImage = getFromImage(dockerfile);
|
var fromImage = getFromImage(dockerfile);
|
||||||
console.log('From image: ' + fromImage);
|
console.log('From image: ' + fromImage);
|
||||||
var installedImage = null;
|
var installedImage = null;
|
||||||
|
@ -170,7 +153,7 @@ pullImageFromDockerfile = function (dockerfile, imageId, callback) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
buildImage = function (image, callback) {
|
Images.build = function (image, callback) {
|
||||||
Fiber(function () {
|
Fiber(function () {
|
||||||
var tarFilePath = createTarFileSync(image);
|
var tarFilePath = createTarFileSync(image);
|
||||||
Images.update(image._id, {
|
Images.update(image._id, {
|
||||||
|
@ -251,29 +234,7 @@ Meteor.methods({
|
||||||
};
|
};
|
||||||
var imageMetaData = getImageMetaData(directory);
|
var imageMetaData = getImageMetaData(directory);
|
||||||
imageObj.meta = imageMetaData;
|
imageObj.meta = imageMetaData;
|
||||||
var imageId = Images.insert(imageObj);
|
Images.insert(imageObj);
|
||||||
var imagePath = path.join(KITE_IMAGES_PATH, imageId);
|
|
||||||
Images.update(imageId, {
|
|
||||||
$set: {
|
|
||||||
path: imagePath
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (imageObj.meta.logo) {
|
|
||||||
Images.update(imageId, {
|
|
||||||
$set: {
|
|
||||||
logoPath: path.join(imagePath, imageObj.meta.logo)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
var image = Images.findOne(imageId);
|
|
||||||
saveImageFolderSync(directory, imageId);
|
|
||||||
console.log('Saved folder sync');
|
|
||||||
pullImageFromDockerfile(fs.readFileSync(path.join(image.path, 'Dockerfile'), 'utf8'), imageId, function (err) {
|
|
||||||
if (err) { throw err; }
|
|
||||||
buildImage(image, function (err) {
|
|
||||||
if (err) { console.error(err); }
|
|
||||||
});
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
rebuildImage: function (imageId) {
|
rebuildImage: function (imageId) {
|
||||||
this.unblock();
|
this.unblock();
|
||||||
|
@ -300,7 +261,7 @@ Meteor.methods({
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
rebuildImageSync(image);
|
Images.rebuildSync(image);
|
||||||
_.each(apps, function (app) {
|
_.each(apps, function (app) {
|
||||||
app = Apps.findOne(app._id);
|
app = Apps.findOne(app._id);
|
||||||
Meteor.call('runApp', app, function (err) {
|
Meteor.call('runApp', app, function (err) {
|
||||||
|
@ -308,7 +269,7 @@ Meteor.methods({
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
rebuildImageSync(image);
|
Images.rebuildSync(image);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
changeDirectory: function (imageId, directory) {
|
changeDirectory: function (imageId, directory) {
|
||||||
|
@ -337,15 +298,7 @@ Meteor.methods({
|
||||||
}
|
}
|
||||||
var app = Apps.findOne({imageId: imageId});
|
var app = Apps.findOne({imageId: imageId});
|
||||||
if (!app) {
|
if (!app) {
|
||||||
console.log('here');
|
Images.remove({_id: image._id});
|
||||||
try {
|
|
||||||
deleteImageSync(image);
|
|
||||||
Util.deleteFolder(image.path);
|
|
||||||
} catch (e) {
|
|
||||||
console.log(e);
|
|
||||||
} finally {
|
|
||||||
Images.remove({_id: image._id});
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
throw new Meteor.Error(400, 'This image is currently being used by <a href="/apps/' + app.name + '">' + app.name + "</a>.");
|
throw new Meteor.Error(400, 'This image is currently being used by <a href="/apps/' + app.name + '">' + app.name + "</a>.");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue