2017-11-01 15:24:59 +00:00
|
|
|
package libpod
|
|
|
|
|
|
|
|
import (
|
2018-08-16 10:41:15 +00:00
|
|
|
"github.com/containers/libpod/libpod/layers"
|
2017-11-01 15:24:59 +00:00
|
|
|
"github.com/containers/storage/pkg/archive"
|
|
|
|
"github.com/pkg/errors"
|
|
|
|
)
|
|
|
|
|
Don't output inodes created to run a container
There is a group of inodes that get created when running a container
if they do not exist.
containerMounts = 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,
}
If the destination inode does not exist, libpod/runc will create the inode.
This can cause programs like podman diff to see the image as having changed,
when actually it has not. This patch ignores changes in these inodes.
Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
Closes: #1508
Approved by: giuseppe
2018-09-19 13:54:15 +00:00
|
|
|
var containerMounts = 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,
|
|
|
|
}
|
|
|
|
|
2017-11-01 15:24:59 +00:00
|
|
|
// GetDiff returns the differences between the two images, layers, or containers
|
|
|
|
func (r *Runtime) GetDiff(from, to string) ([]archive.Change, error) {
|
|
|
|
toLayer, err := r.getLayerID(to)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
fromLayer := ""
|
|
|
|
if from != "" {
|
|
|
|
fromLayer, err = r.getLayerID(from)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
Don't output inodes created to run a container
There is a group of inodes that get created when running a container
if they do not exist.
containerMounts = 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,
}
If the destination inode does not exist, libpod/runc will create the inode.
This can cause programs like podman diff to see the image as having changed,
when actually it has not. This patch ignores changes in these inodes.
Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
Closes: #1508
Approved by: giuseppe
2018-09-19 13:54:15 +00:00
|
|
|
var rchanges []archive.Change
|
|
|
|
changes, err := r.store.Changes(fromLayer, toLayer)
|
|
|
|
if err == nil {
|
|
|
|
for _, c := range changes {
|
|
|
|
if containerMounts[c.Path] {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
rchanges = append(rchanges, c)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return rchanges, err
|
2017-11-01 15:24:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// 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) (string, error) {
|
|
|
|
var toLayer string
|
2018-03-22 15:17:50 +00:00
|
|
|
toImage, err := r.imageRuntime.NewFromLocal(id)
|
2017-11-01 15:24:59 +00:00
|
|
|
if err != nil {
|
|
|
|
toCtr, err := r.store.Container(id)
|
|
|
|
if err != nil {
|
|
|
|
toLayer, err = layers.FullID(r.store, id)
|
|
|
|
if err != nil {
|
|
|
|
return "", errors.Errorf("layer, image, or container %s does not exist", id)
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
toLayer = toCtr.LayerID
|
|
|
|
}
|
|
|
|
} else {
|
2018-03-22 15:17:50 +00:00
|
|
|
toLayer = toImage.TopLayer()
|
2017-11-01 15:24:59 +00:00
|
|
|
}
|
|
|
|
return toLayer, nil
|
|
|
|
}
|