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
This commit is contained in:
Daniel J Walsh 2018-09-19 09:54:15 -04:00 committed by Atomic Bot
parent 6191ffb6c5
commit fbd1392a46
2 changed files with 25 additions and 3 deletions

View file

@ -111,8 +111,8 @@ class TestContainers(PodmanTestCase):
list(actual.keys())))
# TODO: brittle, depends on knowing history of ctnr
self.assertGreaterEqual(len(actual['changed']), 2)
self.assertGreaterEqual(len(actual['added']), 2)
self.assertGreaterEqual(len(actual['changed']), 0)
self.assertGreaterEqual(len(actual['added']), 0)
self.assertEqual(len(actual['deleted']), 0)
def test_kill(self):

View file

@ -6,6 +6,18 @@ import (
"github.com/pkg/errors"
)
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,
}
// 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)
@ -19,7 +31,17 @@ func (r *Runtime) GetDiff(from, to string) ([]archive.Change, error) {
return nil, err
}
}
return r.store.Changes(fromLayer, toLayer)
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
}
// GetLayerID gets a full layer id given a full or partial id