|
@@ -3,8 +3,10 @@ package chrootarchive
|
|
import (
|
|
import (
|
|
"flag"
|
|
"flag"
|
|
"fmt"
|
|
"fmt"
|
|
|
|
+ "io"
|
|
"io/ioutil"
|
|
"io/ioutil"
|
|
"os"
|
|
"os"
|
|
|
|
+ "path/filepath"
|
|
"runtime"
|
|
"runtime"
|
|
"syscall"
|
|
"syscall"
|
|
|
|
|
|
@@ -16,19 +18,20 @@ func applyLayer() {
|
|
runtime.LockOSThread()
|
|
runtime.LockOSThread()
|
|
flag.Parse()
|
|
flag.Parse()
|
|
|
|
|
|
- if err := syscall.Chroot(flag.Arg(0)); err != nil {
|
|
|
|
- fatal(err)
|
|
|
|
- }
|
|
|
|
- if err := syscall.Chdir("/"); err != nil {
|
|
|
|
|
|
+ if err := chroot(flag.Arg(0)); err != nil {
|
|
fatal(err)
|
|
fatal(err)
|
|
}
|
|
}
|
|
|
|
+ // We need to be able to set any perms
|
|
|
|
+ oldmask := syscall.Umask(0)
|
|
|
|
+ defer syscall.Umask(oldmask)
|
|
tmpDir, err := ioutil.TempDir("/", "temp-docker-extract")
|
|
tmpDir, err := ioutil.TempDir("/", "temp-docker-extract")
|
|
if err != nil {
|
|
if err != nil {
|
|
fatal(err)
|
|
fatal(err)
|
|
}
|
|
}
|
|
os.Setenv("TMPDIR", tmpDir)
|
|
os.Setenv("TMPDIR", tmpDir)
|
|
- if err := archive.ApplyLayer("/", os.Stdin); err != nil {
|
|
|
|
- os.RemoveAll(tmpDir)
|
|
|
|
|
|
+ err = archive.UnpackLayer("/", os.Stdin)
|
|
|
|
+ os.RemoveAll(tmpDir)
|
|
|
|
+ if err != nil {
|
|
fatal(err)
|
|
fatal(err)
|
|
}
|
|
}
|
|
os.RemoveAll(tmpDir)
|
|
os.RemoveAll(tmpDir)
|
|
@@ -37,8 +40,18 @@ func applyLayer() {
|
|
}
|
|
}
|
|
|
|
|
|
func ApplyLayer(dest string, layer archive.ArchiveReader) error {
|
|
func ApplyLayer(dest string, layer archive.ArchiveReader) error {
|
|
|
|
+ dest = filepath.Clean(dest)
|
|
|
|
+ decompressed, err := archive.DecompressStream(layer)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ defer func() {
|
|
|
|
+ if c, ok := decompressed.(io.Closer); ok {
|
|
|
|
+ c.Close()
|
|
|
|
+ }
|
|
|
|
+ }()
|
|
cmd := reexec.Command("docker-applyLayer", dest)
|
|
cmd := reexec.Command("docker-applyLayer", dest)
|
|
- cmd.Stdin = layer
|
|
|
|
|
|
+ cmd.Stdin = decompressed
|
|
out, err := cmd.CombinedOutput()
|
|
out, err := cmd.CombinedOutput()
|
|
if err != nil {
|
|
if err != nil {
|
|
return fmt.Errorf("ApplyLayer %s %s", err, out)
|
|
return fmt.Errorf("ApplyLayer %s %s", err, out)
|