From 54e58f280802c7a0816b89e9a5ab498aa31143d4 Mon Sep 17 00:00:00 2001 From: Justin Cormack Date: Sun, 4 Jun 2017 17:50:13 +0100 Subject: [PATCH] Allow specification of multiple yaml files for a single build Each section will be appended in order of the CLI, other then kernel where last specified one wins. This is useful if you eg want to have a base version for (say) AWS and GCP and then add your own image on top. Signed-off-by: Justin Cormack --- cmd/moby/build.go | 61 +++++++++++++++++++++++++--------------------- cmd/moby/config.go | 19 +++++++++++++++ 2 files changed, 52 insertions(+), 28 deletions(-) diff --git a/cmd/moby/build.go b/cmd/moby/build.go index 97ad5a563..6f82613ad 100644 --- a/cmd/moby/build.go +++ b/cmd/moby/build.go @@ -87,41 +87,46 @@ func build(args []string) { } name := *buildName - var config []byte - if conf := remArgs[0]; conf == "-" { - var err error - config, err = ioutil.ReadAll(os.Stdin) - if err != nil { - log.Fatalf("Cannot read stdin: %v", err) - } - if name == "" { - name = defaultNameForStdin - } - } else { - if !(filepath.Ext(conf) == ".yml" || filepath.Ext(conf) == ".yaml") { - conf = conf + ".yml" - } - var err error - config, err = ioutil.ReadFile(conf) - if err != nil { - log.Fatalf("Cannot open config file: %v", err) - } - if name == "" { - name = strings.TrimSuffix(filepath.Base(conf), filepath.Ext(conf)) - } - } - m, err := NewConfig(config) - if err != nil { - log.Fatalf("Invalid config: %v", err) + var moby Moby + for _, arg := range remArgs { + var config []byte + if conf := arg; conf == "-" { + var err error + config, err = ioutil.ReadAll(os.Stdin) + if err != nil { + log.Fatalf("Cannot read stdin: %v", err) + } + if name == "" { + name = defaultNameForStdin + } + } else { + if !(filepath.Ext(conf) == ".yml" || filepath.Ext(conf) == ".yaml") { + conf = conf + ".yml" + } + var err error + config, err = ioutil.ReadFile(conf) + if err != nil { + log.Fatalf("Cannot open config file: %v", err) + } + if name == "" { + name = strings.TrimSuffix(filepath.Base(conf), filepath.Ext(conf)) + } + } + + m, err := NewConfig(config) + if err != nil { + log.Fatalf("Invalid config: %v", err) + } + moby = AppendConfig(moby, m) } if *buildDisableTrust { log.Debugf("Disabling content trust checks for this build") - m.Trust = TrustConfig{} + moby.Trust = TrustConfig{} } - image := buildInternal(m, *buildPull) + image := buildInternal(moby, *buildPull) log.Infof("Create outputs:") err = outputs(filepath.Join(*buildDir, name), image, buildOut, size, *buildHyperkit) diff --git a/cmd/moby/config.go b/cmd/moby/config.go index fa6c5a4d1..39ab61098 100644 --- a/cmd/moby/config.go +++ b/cmd/moby/config.go @@ -135,6 +135,25 @@ func NewConfig(config []byte) (Moby, error) { return m, nil } +// AppendConfig appends two configs. +func AppendConfig(m0, m1 Moby) Moby { + moby := m0 + if m1.Kernel.Image != "" { + moby.Kernel.Image = m1.Kernel.Image + } + if m1.Kernel.Cmdline != "" { + moby.Kernel.Cmdline = m1.Kernel.Cmdline + } + moby.Init = append(moby.Init, m1.Init...) + moby.Onboot = append(moby.Onboot, m1.Onboot...) + moby.Services = append(moby.Services, m1.Services...) + moby.Files = append(moby.Files, m1.Files...) + moby.Trust.Image = append(moby.Trust.Image, m1.Trust.Image...) + moby.Trust.Org = append(moby.Trust.Org, m1.Trust.Org...) + + return moby +} + // NewImage validates an parses yaml or json for a MobyImage func NewImage(config []byte) (MobyImage, error) { log.Debugf("Reading label config: %s", string(config))