mirror of
https://github.com/containers/podman.git
synced 2025-05-17 23:26:08 +08:00
Correctly export the root file-system changes
When doing a checkpoint with --export the root file-system diff was not working as expected. Instead of getting the changes from the running container to the highest storage layer it got the changes from the highest layer to that parent's layer. For a one layer container this could mean that the complete root file-system is part of the checkpoint. With this commit this changes to use the same functionality as 'podman diff'. This actually enables to correctly diff the root file-system including tracking deleted files. This also removes the non-working helper functions from libpod/diff.go. Signed-off-by: Adrian Reber <areber@redhat.com>
This commit is contained in:
@ -1,7 +1,6 @@
|
||||
package libpod
|
||||
|
||||
import (
|
||||
"archive/tar"
|
||||
"io"
|
||||
|
||||
"github.com/containers/libpod/libpod/layers"
|
||||
@ -47,49 +46,6 @@ func (r *Runtime) GetDiff(from, to string) ([]archive.Change, error) {
|
||||
return rchanges, err
|
||||
}
|
||||
|
||||
// skipFileInTarAchive is an archive.TarModifierFunc function
|
||||
// which tells archive.ReplaceFileTarWrapper to skip files
|
||||
// from the tarstream
|
||||
func skipFileInTarAchive(path string, header *tar.Header, content io.Reader) (*tar.Header, []byte, error) {
|
||||
return nil, nil, nil
|
||||
}
|
||||
|
||||
// GetDiffTarStream returns the differences between the two images, layers, or containers.
|
||||
// It is the same functionality as GetDiff() except that it returns a tarstream
|
||||
func (r *Runtime) GetDiffTarStream(from, to string) (io.ReadCloser, 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
|
||||
}
|
||||
}
|
||||
rc, err := r.store.Diff(fromLayer, toLayer, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Skip files in the tar archive which are listed
|
||||
// in containerMounts map. Just as in the GetDiff()
|
||||
// function from above
|
||||
filterMap := make(map[string]archive.TarModifierFunc)
|
||||
for key := range containerMounts {
|
||||
filterMap[key[1:]] = skipFileInTarAchive
|
||||
// In the tarstream directories always include a trailing '/'.
|
||||
// For simplicity this duplicates every entry from
|
||||
// containerMounts with a trailing '/', as containerMounts
|
||||
// does not use trailing '/' for directories.
|
||||
filterMap[key[1:]+"/"] = skipFileInTarAchive
|
||||
}
|
||||
|
||||
filteredTarStream := archive.ReplaceFileTarWrapper(rc, filterMap)
|
||||
return filteredTarStream, nil
|
||||
}
|
||||
|
||||
// ApplyDiffTarStream applies the changes stored in 'diff' to the layer 'to'
|
||||
func (r *Runtime) ApplyDiffTarStream(to string, diff io.Reader) error {
|
||||
toLayer, err := r.getLayerID(to)
|
||||
|
Reference in New Issue
Block a user