Browse code

Ignore `layer does not exist` error from `docker images`

Fix #31350

As we can see in `daemon.Images()`, there is a gap between
`allImages = daemon.imageStore.Map()` and `l, err :=
daemon.layerStore.Get(layerID)`, so images which still exist when we hit
`allImages = daemon.imageStore.Map()` may have already been deleted when we hit
`l, err := daemon.layerStore.Get(layerID)`.

```
if danglingOnly {
allImages = daemon.imageStore.Heads()
} else {
allImages = daemon.imageStore.Map()
}

...

for id, img := range allImages {
...

layerID := img.RootFS.ChainID()
var size int64
if layerID != "" {
l, err := daemon.layerStore.Get(layerID)
if err != nil {
return nil, err
}
```

Signed-off-by: Yuanhong Peng <pengyuanhong@huawei.com>

Yuanhong Peng authored on 2017/03/15 23:14:14
Showing 1 changed files
... ...
@@ -118,6 +118,11 @@ func (daemon *Daemon) Images(imageFilters filters.Args, all bool, withExtraAttrs
118 118
 		if layerID != "" {
119 119
 			l, err := daemon.layerStore.Get(layerID)
120 120
 			if err != nil {
121
+				// The layer may have been deleted between the call to `Map()` or
122
+				// `Heads()` and the call to `Get()`, so we just ignore this error
123
+				if err == layer.ErrLayerDoesNotExist {
124
+					continue
125
+				}
121 126
 				return nil, err
122 127
 			}
123 128