mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Do not allow image to be deleted when containers are dependent
This commit is contained in:
parent
b440ec0136
commit
7f429e0ceb
1 changed files with 35 additions and 0 deletions
35
server.go
35
server.go
|
@ -996,6 +996,14 @@ func (srv *Server) ContainerDestroy(name string, removeVolume bool) error {
|
|||
|
||||
var ErrImageReferenced = errors.New("Image referenced by a repository")
|
||||
|
||||
func (srv *Server) getChildImages(id string) ([]*Image, error) {
|
||||
byParents, err := srv.runtime.graph.ByParent()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return byParents[id], nil
|
||||
}
|
||||
|
||||
func (srv *Server) deleteImageAndChildren(id string, imgs *[]APIRmi) error {
|
||||
// If the image is referenced by a repo, do not delete
|
||||
if len(srv.runtime.repositories.ByID()[id]) != 0 {
|
||||
|
@ -1101,6 +1109,33 @@ func (srv *Server) ImageDelete(name string, autoPrune bool) ([]APIRmi, error) {
|
|||
if err != nil {
|
||||
return nil, fmt.Errorf("No such image: %s", name)
|
||||
}
|
||||
images := make(map[string]bool)
|
||||
images[img.ID] = true
|
||||
|
||||
children, err := srv.getChildImages(img.ID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, i := range children {
|
||||
images[i.ID] = true
|
||||
}
|
||||
|
||||
// Check for any containers referencing the image or children of the image
|
||||
referencedContainers := []string{}
|
||||
|
||||
for e := srv.runtime.containers.Front(); e != nil; e = e.Next() {
|
||||
c := e.Value.(*Container)
|
||||
if images[c.Image] {
|
||||
referencedContainers = append(referencedContainers, c.ID)
|
||||
}
|
||||
}
|
||||
|
||||
if len(referencedContainers) > 0 {
|
||||
return nil, fmt.Errorf("Cannot delete image with existing containers. Please remove %s before deleting image.",
|
||||
strings.Join(referencedContainers, ", "))
|
||||
}
|
||||
|
||||
if !autoPrune {
|
||||
if err := srv.runtime.DeleteImage(img.ID); err != nil {
|
||||
return nil, fmt.Errorf("Error deleting image %s: %s", name, err)
|
||||
|
|
Loading…
Add table
Reference in a new issue