mirror of
https://github.com/containers/podman.git
synced 2025-05-22 09:36:57 +08:00

First, make podman diff accept optionally a second argument. This allows the user to specify a second image/container to compare the first with. If it is not set the parent layer will be used as before. Second, podman container diff should only use containers and podman image diff should only use images. Previously, podman container diff would use the image when both an image and container with this name exists. To make this work two new parameters have been added to the api. If they are not used the previous behaviour is used. The same applies to the bindings. Fixes #10649 Signed-off-by: Paul Holzinger <pholzing@redhat.com>
80 lines
2.0 KiB
Go
80 lines
2.0 KiB
Go
package libpod
|
|
|
|
import (
|
|
"github.com/containers/common/libimage"
|
|
"github.com/containers/podman/v3/libpod/define"
|
|
"github.com/containers/podman/v3/libpod/layers"
|
|
"github.com/containers/storage/pkg/archive"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
var initInodes = map[string]bool{
|
|
"/dev": true,
|
|
"/etc/hostname": true,
|
|
"/etc/hosts": true,
|
|
"/etc/resolv.conf": true,
|
|
"/proc": true,
|
|
"/run": true,
|
|
"/run/.containerenv": true,
|
|
"/run/secrets": true,
|
|
"/sys": true,
|
|
"/etc/mtab": true,
|
|
}
|
|
|
|
// GetDiff returns the differences between the two images, layers, or containers
|
|
func (r *Runtime) GetDiff(from, to string, diffType define.DiffType) ([]archive.Change, error) {
|
|
toLayer, err := r.getLayerID(to, diffType)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
fromLayer := ""
|
|
if from != "" {
|
|
fromLayer, err = r.getLayerID(from, diffType)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
var rchanges []archive.Change
|
|
changes, err := r.store.Changes(fromLayer, toLayer)
|
|
if err == nil {
|
|
for _, c := range changes {
|
|
if initInodes[c.Path] {
|
|
continue
|
|
}
|
|
rchanges = append(rchanges, c)
|
|
}
|
|
}
|
|
return rchanges, err
|
|
}
|
|
|
|
// GetLayerID gets a full layer id given a full or partial id
|
|
// If the id matches a container or image, the id of the top layer is returned
|
|
// If the id matches a layer, the top layer id is returned
|
|
func (r *Runtime) getLayerID(id string, diffType define.DiffType) (string, error) {
|
|
var lastErr error
|
|
if diffType&define.DiffImage == define.DiffImage {
|
|
toImage, _, err := r.libimageRuntime.LookupImage(id, &libimage.LookupImageOptions{IgnorePlatform: true})
|
|
if err == nil {
|
|
return toImage.TopLayer(), nil
|
|
}
|
|
lastErr = err
|
|
}
|
|
|
|
if diffType&define.DiffContainer == define.DiffContainer {
|
|
toCtr, err := r.store.Container(id)
|
|
if err == nil {
|
|
return toCtr.LayerID, nil
|
|
}
|
|
lastErr = err
|
|
}
|
|
|
|
if diffType == define.DiffAll {
|
|
toLayer, err := layers.FullID(r.store, id)
|
|
if err == nil {
|
|
return toLayer, nil
|
|
}
|
|
lastErr = err
|
|
}
|
|
return "", errors.Wrapf(lastErr, "%s not found", id)
|
|
}
|