Fixed bug when image doesn't finish building.

This commit is contained in:
Sean Li 2014-10-09 11:25:47 -07:00
parent 0f07fc9b51
commit 0f6b7746aa
9 changed files with 62 additions and 28 deletions

2
.gitignore vendored
View File

@ -10,7 +10,7 @@ bin
# Resources # Resources
resources/cache resources/cache
resources/base-images.tar.gz resources/base-images-*.tar.gz
resources/virtualbox-*.pkg resources/virtualbox-*.pkg
resources/boot2docker* resources/boot2docker*
resources/node-webkit resources/node-webkit

View File

@ -169,6 +169,13 @@ var convertVolumeObjToArray = function (obj) {
}; };
Docker.getImageData = function (imageId, callback) { Docker.getImageData = function (imageId, callback) {
docker.listImages({all: false}, function (err, images) {
if (err) {
callback(err, null);
} else {
var dockerImage = _.find(images, function (image) {
return image.Id === imageId;
});
var image = docker.getImage(imageId); var image = docker.getImage(imageId);
image.inspect(function (err, data) { image.inspect(function (err, data) {
if (err) { if (err) {
@ -180,7 +187,19 @@ Docker.getImageData = function (imageId, callback) {
if (data.ContainerConfig && data.ContainerConfig.Volumes) { if (data.ContainerConfig && data.ContainerConfig.Volumes) {
data.ContainerConfig.Volumes = convertVolumeObjToArray(data.ContainerConfig.Volumes); data.ContainerConfig.Volumes = convertVolumeObjToArray(data.ContainerConfig.Volumes);
} }
/*console.log('Image ID');
console.log(imageId);
console.log('Raw Docker Data:');
console.log(dockerImage);
console.log('Inspected Data:');
console.log(data);*/
if (!dockerImage) {
callback(null, data); callback(null, data);
} else {
callback(null, _.extend(dockerImage, data));
}
}
});
} }
}); });
}; };
@ -196,8 +215,7 @@ Docker.listImages = function (callback) {
if (err) { if (err) {
cb(err, null); cb(err, null);
} else { } else {
var mergedData = _.extend(image, data); cb(null, data);
cb(null, mergedData);
} }
}); });
} }
@ -273,7 +291,7 @@ Docker.resolveDefaultImages = function () {
image.inspect(function (err) { image.inspect(function (err) {
if (err) { if (err) {
if (err.reason === 'no such image') { if (err.reason === 'no such image') {
docker.loadImage(path.join(Util.getBinDir(), 'base-images.tar.gz'), {}, function (err) { docker.loadImage(path.join(Util.getBinDir(), Docker.DEFAULT_IMAGES_FILENAME), {}, function (err) {
if (err) { if (err) {
innerCallback(err); innerCallback(err);
return; return;

View File

@ -44,9 +44,13 @@ ImageUtil.getMetaData = function (directory) {
if (!kiteJSON.name) { if (!kiteJSON.name) {
kiteJSON.name = _.last(directory.split(path.sep)); kiteJSON.name = _.last(directory.split(path.sep));
} }
if (!kiteJSON.version) {
kiteJSON.version = 'latest';
}
} else { } else {
kiteJSON = { kiteJSON = {
name: _.last(directory.split(path.sep)) name: _.last(directory.split(path.sep)),
version: 'latest'
}; };
} }
return kiteJSON; return kiteJSON;
@ -222,6 +226,7 @@ ImageUtil.build = function (image, callback) {
} }
var imageData = null; var imageData = null;
Docker.getImageData(image.meta.name + ':' + image.meta.version, function (err, data) { Docker.getImageData(image.meta.name + ':' + image.meta.version, function (err, data) {
console.log(data);
if (err) { if (err) {
console.error(err); console.error(err);
Images.update(image._id, { Images.update(image._id, {
@ -277,19 +282,19 @@ ImageUtil.sync = function () {
} else { } else {
var images = Images.find({}).fetch(); var images = Images.find({}).fetch();
_.each(images, function (image) { _.each(images, function (image) {
if (image.docker && image.docker.Id) { var image = Images.findOne(image._id);
if (image && image.docker && image.docker.Id) {
var duplicateImages = Images.find({'docker.Id': image.docker.Id, _id: {$ne: image._id}}).fetch();
_.each(duplicateImages, function (duplicateImage) {
Images.remove(duplicateImage._id);
});
var imageData = _.find(dockerImages, function (dockerImage) { var imageData = _.find(dockerImages, function (dockerImage) {
return dockerImage.Id === image.docker.Id; return dockerImage.Id === image.docker.Id;
}); });
if (imageData && imageData.RepoTags) { if (imageData && imageData.RepoTags) {
var repoTag = _.first(imageData.RepoTags);
var repoTagTokens = repoTag.split(':');
var name = repoTagTokens[0];
var version = repoTagTokens[1];
Images.update(image._id, { Images.update(image._id, {
$set: { $set: {
'meta.name': name, tags: imageData.RepoTags
'meta.version': version
} }
}); });
} }
@ -314,7 +319,7 @@ ImageUtil.sync = function () {
_.each(diffImages, function (imageId) { _.each(diffImages, function (imageId) {
var image = Images.findOne({'docker.Id': imageId}); var image = Images.findOne({'docker.Id': imageId});
if (image && image.status !== 'BUILDING') { if (image && image.status !== 'BUILDING') {
//ImageUtil.remove(image._id); ImageUtil.remove(image._id);
} }
}); });
var diffDockerImages = _.reject(dockerImages, function (image) { var diffDockerImages = _.reject(dockerImages, function (image) {
@ -328,17 +333,19 @@ ImageUtil.sync = function () {
var buildingImage = _.find(images, function (image) { var buildingImage = _.find(images, function (image) {
return image.status === 'BUILDING' && image.meta.name === name && image.meta.version === version; return image.status === 'BUILDING' && image.meta.name === name && image.meta.version === version;
}); });
if (!buildingImage) { if (!buildingImage && name !== '<none>' && version !== '<none>') {
var imageObj = { var imageObj = {
status: 'READY', status: 'READY',
docker: image, docker: image,
buildLogs: [], buildLogs: [],
createdAt: new Date(), createdAt: new Date(),
tags: image.RepoTags,
meta: { meta: {
name: name, name: name,
version: version version: version
} }
}; };
console.log(imageObj);
Images.insert(imageObj); Images.insert(imageObj);
} }
}); });

View File

@ -67,6 +67,10 @@ Handlebars.registerHelper('isUpdating', function () {
return Session.get('isUpdating'); return Session.get('isUpdating');
}); });
Handlebars.registerHelper('displayTags', function (tags, delimiter) {
return tags.join(delimiter);
});
var fixBoot2DockerVM = function (callback) { var fixBoot2DockerVM = function (callback) {
Boot2Docker.check(function (err) { Boot2Docker.check(function (err) {
if (err) { if (err) {

View File

@ -1,5 +1,5 @@
Template.dashboard_apps.helpers({ Template.dashboard_apps.helpers({
apps: function () { apps: function () {
return Apps.find({name: {$ne: 'kite-dns'}}, {sort: {createdAt: -1}}); return Apps.find({}, {sort: {createdAt: -1}});
} }
}); });

View File

@ -49,6 +49,7 @@ Template.modal_create_image.events({
}; };
var imageMetaData = ImageUtil.getMetaData(directory); var imageMetaData = ImageUtil.getMetaData(directory);
imageObj.meta = imageMetaData; imageObj.meta = imageMetaData;
imageObj.tags = [imageMetaData.name + ':' + imageMetaData.version];
var imageId = Images.insert(imageObj); var imageId = Images.insert(imageObj);
var imagePath = path.join(Util.KITE_IMAGES_PATH, imageId); var imagePath = path.join(Util.KITE_IMAGES_PATH, imageId);
Images.update(imageId, { Images.update(imageId, {

View File

@ -1,5 +1,5 @@
Template.dashboard_images.helpers({ Template.dashboard_images.helpers({
images: function () { images: function () {
return Images.find({'meta.name': {$ne: 'kite-dns'}}, {sort: {createdAt: -1}}); return Images.find({}, {sort: {createdAt: -1}});
} }
}); });

View File

@ -18,7 +18,7 @@
{{/if}} {{/if}}
{{/if}} {{/if}}
{{/if}} {{/if}}
<a onclick="trackLink('image detail')" href="/images/{{_id}}" class="name">{{meta.name}}:{{meta.version}}</a> <a onclick="trackLink('image detail')" href="/images/{{_id}}" class="name">{{displayTags tags ', '}}</a>
{{#if $eq status 'BUILDING'}} {{#if $eq status 'BUILDING'}}
<small>Creating image. This may take a couple minutes...</small> <small>Creating image. This may take a couple minutes...</small>
{{else}} {{else}}
@ -33,8 +33,10 @@
<a onclick="trackLink('open image folder')" href="#" class="btn-icon btn-folder" target="_blank" data-toggle="tooltip" data-placement="bottom" title="Folder"><span class="typcn typcn-folder-open"></span></a> <a onclick="trackLink('open image folder')" href="#" class="btn-icon btn-folder" target="_blank" data-toggle="tooltip" data-placement="bottom" title="Folder"><span class="typcn typcn-folder-open"></span></a>
{{/if}} {{/if}}
{{#if $neq status 'BUILDING'}} {{#if $neq status 'BUILDING'}}
{{#if originPath}}
<a onclick="trackLink('rebuild image')" href="#" class="btn-icon btn-rebuild" target="_blank" data-toggle="tooltip" data-placement="bottom" title="Rebuild"><span class="typcn typcn-refresh-outline"></span></a> <a onclick="trackLink('rebuild image')" href="#" class="btn-icon btn-rebuild" target="_blank" data-toggle="tooltip" data-placement="bottom" title="Rebuild"><span class="typcn typcn-refresh-outline"></span></a>
{{/if}} {{/if}}
{{/if}}
<a onclick="trackLink('image logs')" href="/images/{{_id}}/logs" class="btn-icon" data-toggle="tooltip" data-placement="bottom" title="Logs"><span class="typcn typcn-document-text"></span></a> <a onclick="trackLink('image logs')" href="/images/{{_id}}/logs" class="btn-icon" data-toggle="tooltip" data-placement="bottom" title="Logs"><span class="typcn typcn-document-text"></span></a>
<a onclick="trackLink('image settings')" href="/images/{{_id}}/settings" class="btn-icon" data-toggle="tooltip" data-placement="bottom" title="Settings"><span class="typcn typcn-cog-outline"></span></a> <a onclick="trackLink('image settings')" href="/images/{{_id}}/settings" class="btn-icon" data-toggle="tooltip" data-placement="bottom" title="Settings"><span class="typcn typcn-cog-outline"></span></a>
</div> </div>

View File

@ -18,8 +18,10 @@
<a onclick="trackLink('open image folder')" href="#" class="btn-folder" data-toggle="tooltip" data-placement="bottom" title="Folder" data-container="body"><span class="typcn typcn-folder-open"></span></a> <a onclick="trackLink('open image folder')" href="#" class="btn-folder" data-toggle="tooltip" data-placement="bottom" title="Folder" data-container="body"><span class="typcn typcn-folder-open"></span></a>
{{/if}} {{/if}}
{{#if $neq status 'BUILDING'}} {{#if $neq status 'BUILDING'}}
{{#if originPath}}
<a onclick="trackLink('rebuild image')" href="#" class="btn-rebuild" data-toggle="tooltip" data-placement="bottom" title="Rebuild" data-container="body"><span class="typcn typcn-refresh-outline"></span></a> <a onclick="trackLink('rebuild image')" href="#" class="btn-rebuild" data-toggle="tooltip" data-placement="bottom" title="Rebuild" data-container="body"><span class="typcn typcn-refresh-outline"></span></a>
{{/if}} {{/if}}
{{/if}}
</span> </span>
</h3> </h3>
<div class="options"> <div class="options">