1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
package main
import (
"fmt"
"os"
"github.com/containers/buildah/imagebuildah"
buildahcli "github.com/containers/buildah/pkg/cli"
"github.com/containers/buildah/util"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
func init() {
buildDescription := `
Builds an OCI image using instructions in one or more Containerfiles.
If no arguments are specified, Buildah will use the current working directory
as the build context and look for a Containerfile. The build fails if no
Containerfile nor Dockerfile is present.`
layerFlagsResults := buildahcli.LayerResults{}
buildFlagResults := buildahcli.BudResults{}
fromAndBudResults := buildahcli.FromAndBudResults{}
userNSResults := buildahcli.UserNSResults{}
namespaceResults := buildahcli.NameSpaceResults{}
buildCommand := &cobra.Command{
Use: "build [CONTEXT]",
Aliases: []string{"build-using-dockerfile", "bud"},
Short: "Build an image using instructions in a Containerfile",
Long: buildDescription,
RunE: func(cmd *cobra.Command, args []string) error {
br := buildahcli.BuildOptions{
LayerResults: &layerFlagsResults,
BudResults: &buildFlagResults,
UserNSResults: &userNSResults,
FromAndBudResults: &fromAndBudResults,
NameSpaceResults: &namespaceResults,
}
return buildCmd(cmd, args, br)
},
Args: cobra.MaximumNArgs(1),
Example: `buildah build
buildah bud -f Containerfile.simple .
buildah bud --volume /home/test:/myvol:ro,Z -t imageName .
buildah bud -f Containerfile.simple -f Containerfile.notsosimple .`,
}
buildCommand.SetUsageTemplate(UsageTemplate())
flags := buildCommand.Flags()
flags.SetInterspersed(false)
// build is a all common flags
buildFlags := buildahcli.GetBudFlags(&buildFlagResults)
buildFlags.StringVar(&buildFlagResults.Runtime, "runtime", util.Runtime(), "`path` to an alternate runtime. Use BUILDAH_RUNTIME environment variable to override.")
layerFlags := buildahcli.GetLayerFlags(&layerFlagsResults)
fromAndBudFlags, err := buildahcli.GetFromAndBudFlags(&fromAndBudResults, &userNSResults, &namespaceResults)
if err != nil {
logrus.Errorf("failed to setup From and Build flags: %v", err)
os.Exit(1)
}
flags.AddFlagSet(&buildFlags)
flags.AddFlagSet(&layerFlags)
flags.AddFlagSet(&fromAndBudFlags)
flags.SetNormalizeFunc(buildahcli.AliasFlags)
rootCmd.AddCommand(buildCommand)
}
func buildCmd(c *cobra.Command, inputArgs []string, iopts buildahcli.BuildOptions) error {
if c.Flag("logfile").Changed {
logfile, err := os.OpenFile(iopts.Logfile, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0o600)
if err != nil {
return fmt.Errorf("opening log file: %w", err)
}
iopts.Logwriter = logfile
defer iopts.Logwriter.Close()
}
options, containerfiles, removeAll, err := buildahcli.GenBuildOptions(c, inputArgs, iopts)
if err != nil {
return err
}
defer func() {
for _, f := range removeAll {
os.RemoveAll(f)
}
}()
options.DefaultMountsFilePath = globalFlagResults.DefaultMountsFile
store, err := getStore(c)
if err != nil {
return err
}
id, ref, err := imagebuildah.BuildDockerfiles(getContext(), store, options, containerfiles...)
if err == nil && options.Manifest != "" {
logrus.Debugf("manifest list id = %q, ref = %q", id, ref.String())
}
return err
}
|