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>
... | ... |
@@ -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 |
|