Merge pull request #108 from nalind/layerless-images

Stop rejecting creation of images with no layers
This commit is contained in:
Nalin Dahyabhai 2017-09-29 16:16:54 -04:00 committed by GitHub
commit 84922714d2
3 changed files with 32 additions and 25 deletions

View File

@ -88,7 +88,11 @@ func createImage(flags *mflag.FlagSet, action string, m storage.Store, args []st
}
paramMetadata = string(b)
}
image, err := m.CreateImage(paramID, paramNames, args[0], paramMetadata, nil)
layer := ""
if len(args) > 0 {
layer = args[0]
}
image, err := m.CreateImage(paramID, paramNames, layer, paramMetadata, nil)
if err != nil {
fmt.Fprintf(os.Stderr, "%v\n", err)
return 1
@ -168,7 +172,7 @@ func init() {
names: []string{"create-image", "createimage"},
optionsHelp: "[options [...]] topLayerNameOrID",
usage: "Create a new image using layers",
minArgs: 1,
minArgs: 0,
maxArgs: 1,
action: createImage,
addFlags: func(flags *mflag.FlagSet, cmd *command) {

View File

@ -24,8 +24,9 @@ type Image struct {
// unique among images.
Names []string `json:"names,omitempty"`
// TopLayer is the ID of the topmost layer of the image itself.
// Multiple images can refer to the same top layer.
// TopLayer is the ID of the topmost layer of the image itself, if the
// image contains one or more layers. Multiple images can refer to the
// same top layer.
TopLayer string `json:"layer"`
// Metadata is data we keep for the convenience of the caller. It is not

View File

@ -775,30 +775,32 @@ func (s *store) CreateImage(id string, names []string, layer, metadata string, o
id = stringid.GenerateRandomID()
}
lstore, err := s.LayerStore()
if err != nil {
return nil, err
}
lstores, err := s.ROLayerStores()
if err != nil {
return nil, err
}
var ilayer *Layer
for _, store := range append([]ROLayerStore{lstore}, lstores...) {
store.Lock()
defer store.Unlock()
if modified, err := store.Modified(); modified || err != nil {
store.Load()
if layer != "" {
lstore, err := s.LayerStore()
if err != nil {
return nil, err
}
ilayer, err = store.Get(layer)
if err == nil {
break
lstores, err := s.ROLayerStores()
if err != nil {
return nil, err
}
var ilayer *Layer
for _, store := range append([]ROLayerStore{lstore}, lstores...) {
store.Lock()
defer store.Unlock()
if modified, err := store.Modified(); modified || err != nil {
store.Load()
}
ilayer, err = store.Get(layer)
if err == nil {
break
}
}
if ilayer == nil {
return nil, ErrLayerUnknown
}
layer = ilayer.ID
}
if ilayer == nil {
return nil, ErrLayerUnknown
}
layer = ilayer.ID
ristore, err := s.ImageStore()
if err != nil {