Merge pull request #108 from nalind/layerless-images
Stop rejecting creation of images with no layers
This commit is contained in:
commit
84922714d2
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
44
store.go
44
store.go
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Reference in New Issue