mirror of
				https://github.com/containers/podman.git
				synced 2025-10-31 10:00:01 +08:00 
			
		
		
		
	 c22f3e8b4e
			
		
	
	c22f3e8b4e
	
	
	
		
			
			This leverages conmon's ability to proxy the SD-NOTIFY socket. This prevents locking caused by OCI runtime blocking, waiting for SD-NOTIFY messages, and instead passes the messages directly up to the host. NOTE: Also re-enable the auto-update tests which has been disabled due to flakiness. With this change, Podman properly integrates into systemd. Fixes: #7316 Signed-off-by: Joseph Gooch <mrwizard@dok.org> Signed-off-by: Daniel J Walsh <dwalsh@redhat.com> Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
		
			
				
	
	
		
			80 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package libpod
 | |
| 
 | |
| import (
 | |
| 	"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/notify":        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, nil)
 | |
| 		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)
 | |
| }
 |