2017-11-01 15:24:59 +00:00
|
|
|
package libpod
|
|
|
|
|
|
|
|
import (
|
2022-07-05 09:42:22 +00:00
|
|
|
"fmt"
|
|
|
|
|
2022-01-18 09:14:48 +00:00
|
|
|
"github.com/containers/podman/v4/libpod/define"
|
|
|
|
"github.com/containers/podman/v4/libpod/layers"
|
2017-11-01 15:24:59 +00:00
|
|
|
"github.com/containers/storage/pkg/archive"
|
|
|
|
)
|
|
|
|
|
2021-05-07 19:17:33 +00:00
|
|
|
var initInodes = map[string]bool{
|
2022-05-18 09:34:13 +00:00
|
|
|
"/dev": true,
|
|
|
|
"/etc/hostname": true,
|
|
|
|
"/etc/hosts": true,
|
|
|
|
"/etc/resolv.conf": true,
|
|
|
|
"/proc": true,
|
|
|
|
"/run": true,
|
|
|
|
"/run/notify": true,
|
|
|
|
"/run/.containerenv": true,
|
|
|
|
"/run/secrets": true,
|
|
|
|
define.ContainerInitPath: true,
|
|
|
|
"/sys": true,
|
|
|
|
"/etc/mtab": true,
|
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
|
|
|
}
|
|
|
|
|
2017-11-01 15:24:59 +00:00
|
|
|
// GetDiff returns the differences between the two images, layers, or containers
|
2021-07-01 13:24:20 +00:00
|
|
|
func (r *Runtime) GetDiff(from, to string, diffType define.DiffType) ([]archive.Change, error) {
|
|
|
|
toLayer, err := r.getLayerID(to, diffType)
|
2017-11-01 15:24:59 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
fromLayer := ""
|
|
|
|
if from != "" {
|
2021-07-01 13:24:20 +00:00
|
|
|
fromLayer, err = r.getLayerID(from, diffType)
|
2017-11-01 15:24:59 +00:00
|
|
|
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 {
|
2021-05-07 19:17:33 +00:00
|
|
|
if initInodes[c.Path] {
|
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
|
|
|
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
|
2021-07-01 13:24:20 +00:00
|
|
|
func (r *Runtime) getLayerID(id string, diffType define.DiffType) (string, error) {
|
|
|
|
var lastErr error
|
|
|
|
if diffType&define.DiffImage == define.DiffImage {
|
2021-07-02 12:37:30 +00:00
|
|
|
toImage, _, err := r.libimageRuntime.LookupImage(id, nil)
|
2021-07-01 13:24:20 +00:00
|
|
|
if err == nil {
|
|
|
|
return toImage.TopLayer(), nil
|
|
|
|
}
|
|
|
|
lastErr = err
|
2020-10-03 10:56:42 +00:00
|
|
|
}
|
|
|
|
|
2021-07-01 13:24:20 +00:00
|
|
|
if diffType&define.DiffContainer == define.DiffContainer {
|
|
|
|
toCtr, err := r.store.Container(id)
|
|
|
|
if err == nil {
|
|
|
|
return toCtr.LayerID, nil
|
|
|
|
}
|
|
|
|
lastErr = err
|
2020-10-03 10:56:42 +00:00
|
|
|
}
|
2021-07-01 13:24:20 +00:00
|
|
|
|
|
|
|
if diffType == define.DiffAll {
|
|
|
|
toLayer, err := layers.FullID(r.store, id)
|
|
|
|
if err == nil {
|
|
|
|
return toLayer, nil
|
2017-11-01 15:24:59 +00:00
|
|
|
}
|
2021-07-01 13:24:20 +00:00
|
|
|
lastErr = err
|
2017-11-01 15:24:59 +00:00
|
|
|
}
|
2022-07-05 09:42:22 +00:00
|
|
|
return "", fmt.Errorf("%s not found: %w", id, lastErr)
|
2017-11-01 15:24:59 +00:00
|
|
|
}
|