diff --git a/src/cmd/moby/build.go b/src/cmd/moby/build.go new file mode 100644 index 000000000..d8778e6d1 --- /dev/null +++ b/src/cmd/moby/build.go @@ -0,0 +1,133 @@ +package main + +import ( + "archive/tar" + "bytes" + "errors" + "io" + "log" + + "github.com/docker/moby/src/initrd" +) + +const ( + docker2tar = "mobylinux/docker2tar:82a3f11f70b2959c7100dd6e184b511ebfc65908@sha256:e4fd36febc108477a2e5316d263ac257527779409891c7ac10d455a162df05c1" +) + +func untarKernel(buf *bytes.Buffer, bzimageName, ktarName string) (*bytes.Buffer, *bytes.Buffer, error) { + tr := tar.NewReader(buf) + + var bzimage, ktar *bytes.Buffer + + for { + hdr, err := tr.Next() + if err == io.EOF { + break + } + if err != nil { + log.Fatalln(err) + } + switch hdr.Name { + case bzimageName: + bzimage = new(bytes.Buffer) + _, err := io.Copy(bzimage, tr) + if err != nil { + return nil, nil, err + } + case ktarName: + ktar = new(bytes.Buffer) + _, err := io.Copy(bzimage, tr) + if err != nil { + return nil, nil, err + } + default: + continue + } + } + + if ktar == nil || bzimage == nil { + return nil, nil, errors.New("did not find bzImage and kernel.tar in tarball") + } + + return bzimage, ktar, nil +} + +func containersInitrd(containers []*bytes.Buffer) (*bytes.Buffer, error) { + w := new(bytes.Buffer) + iw := initrd.NewWriter(w) + defer iw.Close() + for _, file := range containers { + _, err := initrd.Copy(iw, file) + if err != nil { + return nil, err + } + } + + return w, nil +} + +func build(m *Moby, name string) { + containers := []*bytes.Buffer{} + + // get kernel bzImage and initrd tarball from container + // TODO examine contents to see what names they might have + const ( + bzimageName = "bzImage" + ktarName = "kernel.tar" + ) + out, err := dockerRun(m.Kernel.Image, "tar", "cf", "-", bzimageName, ktarName) + if err != nil { + log.Fatalf("Failed to extract kernel image and tarball: %v", err) + } + buf := bytes.NewBuffer(out) + bzimage, ktar, err := untarKernel(buf, bzimageName, ktarName) + if err != nil { + log.Fatalf("Could not extract bzImage and kernel filesystem from tarball") + } + containers = append(containers, ktar) + + // convert init image to tarball + init, err := dockerRun("-v", "/var/run/docker.sock:/var/run/docker.sock", docker2tar, m.Init) + if err != nil { + log.Fatalf("Failed to build init tarball: %v", err) + } + buffer := bytes.NewBuffer(init) + containers = append(containers, buffer) + + for i, image := range m.System { + args := ConfigToRun(i, "system", &image) + out, err := dockerRun(args...) + if err != nil { + log.Fatalf("Failed to build container tarball: %v", err) + } + buffer := bytes.NewBuffer(out) + containers = append(containers, buffer) + } + + for i, image := range m.Daemon { + args := ConfigToRun(i, "daemon", &image) + out, err := dockerRun(args...) + if err != nil { + log.Fatalf("Failed to build container tarball: %v", err) + } + buffer := bytes.NewBuffer(out) + containers = append(containers, buffer) + } + + // add files + buffer, err = filesystem(m) + if err != nil { + log.Fatalf("failed to add filesystem parts: %v", err) + } + containers = append(containers, buffer) + + initrd, err := containersInitrd(containers) + if err != nil { + log.Fatalf("Failed to make initrd %v", err) + } + + err = outputs(m, name, bzimage.Bytes(), initrd.Bytes()) + if err != nil { + log.Fatalf("Error writing outputs: %v", err) + } +} diff --git a/src/cmd/moby/main.go b/src/cmd/moby/main.go index ff6c4319a..bcada2d9a 100644 --- a/src/cmd/moby/main.go +++ b/src/cmd/moby/main.go @@ -1,8 +1,6 @@ package main import ( - "archive/tar" - "bytes" "errors" "flag" "fmt" @@ -11,12 +9,6 @@ import ( "log" "os/exec" "path/filepath" - - "github.com/docker/moby/src/initrd" -) - -const ( - docker2tar = "mobylinux/docker2tar:82a3f11f70b2959c7100dd6e184b511ebfc65908@sha256:e4fd36febc108477a2e5316d263ac257527779409891c7ac10d455a162df05c1" ) func dockerRun(args ...string) ([]byte, error) { @@ -104,124 +96,6 @@ func dockerRunInput(input io.Reader, args ...string) ([]byte, error) { return stdout, nil } -func untarKernel(buf *bytes.Buffer, bzimageName, ktarName string) (*bytes.Buffer, *bytes.Buffer, error) { - tr := tar.NewReader(buf) - - var bzimage, ktar *bytes.Buffer - - for { - hdr, err := tr.Next() - if err == io.EOF { - break - } - if err != nil { - log.Fatalln(err) - } - switch hdr.Name { - case bzimageName: - bzimage = new(bytes.Buffer) - _, err := io.Copy(bzimage, tr) - if err != nil { - return nil, nil, err - } - case ktarName: - ktar = new(bytes.Buffer) - _, err := io.Copy(bzimage, tr) - if err != nil { - return nil, nil, err - } - default: - continue - } - } - - if ktar == nil || bzimage == nil { - return nil, nil, errors.New("did not find bzImage and kernel.tar in tarball") - } - - return bzimage, ktar, nil -} - -func containersInitrd(containers []*bytes.Buffer) (*bytes.Buffer, error) { - w := new(bytes.Buffer) - iw := initrd.NewWriter(w) - defer iw.Close() - for _, file := range containers { - _, err := initrd.Copy(iw, file) - if err != nil { - return nil, err - } - } - - return w, nil -} - -func build(m *Moby, name string) { - containers := []*bytes.Buffer{} - - // get kernel bzImage and initrd tarball from container - // TODO examine contents to see what names they might have - const ( - bzimageName = "bzImage" - ktarName = "kernel.tar" - ) - out, err := dockerRun(m.Kernel.Image, "tar", "cf", "-", bzimageName, ktarName) - if err != nil { - log.Fatalf("Failed to extract kernel image and tarball: %v", err) - } - buf := bytes.NewBuffer(out) - bzimage, ktar, err := untarKernel(buf, bzimageName, ktarName) - if err != nil { - log.Fatalf("Could not extract bzImage and kernel filesystem from tarball") - } - containers = append(containers, ktar) - - // convert init image to tarball - init, err := dockerRun("-v", "/var/run/docker.sock:/var/run/docker.sock", docker2tar, m.Init) - if err != nil { - log.Fatalf("Failed to build init tarball: %v", err) - } - buffer := bytes.NewBuffer(init) - containers = append(containers, buffer) - - for i, image := range m.System { - args := ConfigToRun(i, "system", &image) - out, err := dockerRun(args...) - if err != nil { - log.Fatalf("Failed to build container tarball: %v", err) - } - buffer := bytes.NewBuffer(out) - containers = append(containers, buffer) - } - - for i, image := range m.Daemon { - args := ConfigToRun(i, "daemon", &image) - out, err := dockerRun(args...) - if err != nil { - log.Fatalf("Failed to build container tarball: %v", err) - } - buffer := bytes.NewBuffer(out) - containers = append(containers, buffer) - } - - // add files - buffer, err = filesystem(m) - if err != nil { - log.Fatalf("failed to add filesystem parts: %v", err) - } - containers = append(containers, buffer) - - initrd, err := containersInitrd(containers) - if err != nil { - log.Fatalf("Failed to make initrd %v", err) - } - - err = outputs(m, name, bzimage.Bytes(), initrd.Bytes()) - if err != nil { - log.Fatalf("Error writing outputs: %v", err) - } -} - var ( conf string name string