podman

Форк
0
/
diff.go 
83 строки · 2.1 Кб
1
//go:build !remote
2

3
package libpod
4

5
import (
6
	"fmt"
7

8
	"github.com/containers/podman/v5/libpod/define"
9
	"github.com/containers/podman/v5/libpod/layers"
10
	"github.com/containers/storage/pkg/archive"
11
)
12

13
var initInodes = map[string]bool{
14
	"/dev":                   true,
15
	"/etc/hostname":          true,
16
	"/etc/hosts":             true,
17
	"/etc/resolv.conf":       true,
18
	"/proc":                  true,
19
	"/run":                   true,
20
	"/run/notify":            true,
21
	"/run/.containerenv":     true,
22
	"/run/secrets":           true,
23
	define.ContainerInitPath: true,
24
	"/sys":                   true,
25
	"/etc/mtab":              true,
26
}
27

28
// GetDiff returns the differences between the two images, layers, or containers
29
func (r *Runtime) GetDiff(from, to string, diffType define.DiffType) ([]archive.Change, error) {
30
	toLayer, err := r.getLayerID(to, diffType)
31
	if err != nil {
32
		return nil, err
33
	}
34
	fromLayer := ""
35
	if from != "" {
36
		fromLayer, err = r.getLayerID(from, diffType)
37
		if err != nil {
38
			return nil, err
39
		}
40
	}
41
	var rchanges []archive.Change
42
	changes, err := r.store.Changes(fromLayer, toLayer)
43
	if err == nil {
44
		for _, c := range changes {
45
			if initInodes[c.Path] {
46
				continue
47
			}
48
			rchanges = append(rchanges, c)
49
		}
50
	}
51
	return rchanges, err
52
}
53

54
// GetLayerID gets a full layer id given a full or partial id
55
// If the id matches a container or image, the id of the top layer is returned
56
// If the id matches a layer, the top layer id is returned
57
func (r *Runtime) getLayerID(id string, diffType define.DiffType) (string, error) {
58
	var lastErr error
59
	if diffType&define.DiffImage == define.DiffImage {
60
		toImage, _, err := r.libimageRuntime.LookupImage(id, nil)
61
		if err == nil {
62
			return toImage.TopLayer(), nil
63
		}
64
		lastErr = err
65
	}
66

67
	if diffType&define.DiffContainer == define.DiffContainer {
68
		toCtr, err := r.store.Container(id)
69
		if err == nil {
70
			return toCtr.LayerID, nil
71
		}
72
		lastErr = err
73
	}
74

75
	if diffType == define.DiffAll {
76
		toLayer, err := layers.FullID(r.store, id)
77
		if err == nil {
78
			return toLayer, nil
79
		}
80
		lastErr = err
81
	}
82
	return "", fmt.Errorf("%s not found: %w", id, lastErr)
83
}
84

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.