1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- package chrootarchive // import "github.com/docker/docker/pkg/chrootarchive"
- import (
- "io"
- "github.com/docker/docker/pkg/archive"
- "github.com/pkg/errors"
- "golang.org/x/sys/unix"
- )
- func doUnpack(decompressedArchive io.Reader, relDest, root string, options *archive.TarOptions) error {
- done := make(chan error)
- err := goInChroot(root, func() { done <- archive.Unpack(decompressedArchive, relDest, options) })
- if err != nil {
- return err
- }
- return <-done
- }
- func doPack(relSrc, root string, options *archive.TarOptions) (io.ReadCloser, error) {
- tb, err := archive.NewTarballer(relSrc, options)
- if err != nil {
- return nil, errors.Wrap(err, "error processing tar file")
- }
- err = goInChroot(root, tb.Do)
- if err != nil {
- return nil, errors.Wrap(err, "could not chroot")
- }
- return tb.Reader(), nil
- }
- func doUnpackLayer(root string, layer io.Reader, options *archive.TarOptions) (int64, error) {
- type result struct {
- layerSize int64
- err error
- }
- done := make(chan result)
- err := goInChroot(root, func() {
- // We need to be able to set any perms
- _ = unix.Umask(0)
- size, err := archive.UnpackLayer("/", layer, options)
- done <- result{layerSize: size, err: err}
- })
- if err != nil {
- return 0, err
- }
- res := <-done
- return res.layerSize, res.err
- }
|