mirror of
https://github.com/linuxkit/linuxkit.git
synced 2025-07-22 10:31:35 +00:00
moby: Factor out build code into a separate source file
Signed-off-by: Rolf Neugebauer <rolf.neugebauer@docker.com>
This commit is contained in:
parent
bede7847e3
commit
547a3e9380
133
src/cmd/moby/build.go
Normal file
133
src/cmd/moby/build.go
Normal file
@ -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)
|
||||||
|
}
|
||||||
|
}
|
@ -1,8 +1,6 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"archive/tar"
|
|
||||||
"bytes"
|
|
||||||
"errors"
|
"errors"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
@ -11,12 +9,6 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/docker/moby/src/initrd"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
docker2tar = "mobylinux/docker2tar:82a3f11f70b2959c7100dd6e184b511ebfc65908@sha256:e4fd36febc108477a2e5316d263ac257527779409891c7ac10d455a162df05c1"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func dockerRun(args ...string) ([]byte, error) {
|
func dockerRun(args ...string) ([]byte, error) {
|
||||||
@ -104,124 +96,6 @@ func dockerRunInput(input io.Reader, args ...string) ([]byte, error) {
|
|||||||
return stdout, nil
|
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 (
|
var (
|
||||||
conf string
|
conf string
|
||||||
name string
|
name string
|
||||||
|
Loading…
Reference in New Issue
Block a user