archive_linux.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package chrootarchive // import "github.com/docker/docker/pkg/chrootarchive"
  2. import (
  3. "io"
  4. "github.com/docker/docker/pkg/archive"
  5. "github.com/pkg/errors"
  6. "golang.org/x/sys/unix"
  7. )
  8. func doUnpack(decompressedArchive io.Reader, relDest, root string, options *archive.TarOptions) error {
  9. done := make(chan error)
  10. err := goInChroot(root, func() { done <- archive.Unpack(decompressedArchive, relDest, options) })
  11. if err != nil {
  12. return err
  13. }
  14. return <-done
  15. }
  16. func doPack(relSrc, root string, options *archive.TarOptions) (io.ReadCloser, error) {
  17. tb, err := archive.NewTarballer(relSrc, options)
  18. if err != nil {
  19. return nil, errors.Wrap(err, "error processing tar file")
  20. }
  21. err = goInChroot(root, tb.Do)
  22. if err != nil {
  23. return nil, errors.Wrap(err, "could not chroot")
  24. }
  25. return tb.Reader(), nil
  26. }
  27. func doUnpackLayer(root string, layer io.Reader, options *archive.TarOptions) (int64, error) {
  28. type result struct {
  29. layerSize int64
  30. err error
  31. }
  32. done := make(chan result)
  33. err := goInChroot(root, func() {
  34. // We need to be able to set any perms
  35. _ = unix.Umask(0)
  36. size, err := archive.UnpackLayer("/", layer, options)
  37. done <- result{layerSize: size, err: err}
  38. })
  39. if err != nil {
  40. return 0, err
  41. }
  42. res := <-done
  43. return res.layerSize, res.err
  44. }