diff options
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/podman/build.go | 128 | ||||
-rw-r--r-- | cmd/podman/main.go | 1 |
2 files changed, 129 insertions, 0 deletions
diff --git a/cmd/podman/build.go b/cmd/podman/build.go new file mode 100644 index 000000000..0defb5e79 --- /dev/null +++ b/cmd/podman/build.go @@ -0,0 +1,128 @@ +package main + +import ( + "os" + "os/exec" + "strconv" + + "github.com/pkg/errors" + "github.com/urfave/cli" +) + +var ( + buildFlags = []cli.Flag{ + cli.StringSliceFlag{ + Name: "build-arg", + Usage: "`argument=value` to supply to the builder", + }, + cli.StringSliceFlag{ + Name: "file, f", + Usage: "`pathname or URL` of a Dockerfile", + }, + cli.StringFlag{ + Name: "format", + Usage: "`format` of the built image's manifest and metadata", + }, + cli.BoolFlag{ + Name: "pull-always", + Usage: "pull the image, even if a version is present", + }, + cli.BoolFlag{ + Name: "quiet, q", + Usage: "refrain from announcing build instructions and image read/write progress", + }, + cli.StringFlag{ + Name: "runtime", + Usage: "`path` to an alternate runtime", + }, + cli.StringSliceFlag{ + Name: "runtime-flag", + Usage: "add global flags for the container runtime", + }, + cli.StringFlag{ + Name: "signature-policy", + Usage: "`pathname` of signature policy file (not usually used)", + }, + cli.StringSliceFlag{ + Name: "tag, t", + Usage: "`tag` to apply to the built image", + }, + cli.BoolFlag{ + Name: "tls-verify", + Usage: "require HTTPS and verify certificates when accessing the registry", + }, + } + buildDescription = "podman build launches the Buildah command to build an OCI Image. Buildah must be installed for this command to work." + buildCommand = cli.Command{ + Name: "build", + Aliases: []string{"build"}, + Usage: "Build an image using instructions in a Dockerfile", + Description: buildDescription, + Flags: buildFlags, + Action: buildCmd, + ArgsUsage: "CONTEXT-DIRECTORY | URL", + } +) + +func buildCmd(c *cli.Context) error { + + budCmdArgs := []string{"bud"} + + for _, buildArg := range c.StringSlice("build-arg") { + budCmdArgs = append(budCmdArgs, "--build-arg", buildArg) + } + for _, fileName := range c.StringSlice("file") { + budCmdArgs = append(budCmdArgs, "--file", fileName) + } + if c.IsSet("format") { + budCmdArgs = append(budCmdArgs, "--format", c.String("format")) + } + if c.IsSet("pull-always") { + budCmdArgs = append(budCmdArgs, "--pull-always") + } + if c.IsSet("quiet") { + quietParam := "--quiet=" + strconv.FormatBool(c.Bool("quiet")) + budCmdArgs = append(budCmdArgs, quietParam) + } + if c.IsSet("runtime") { + budCmdArgs = append(budCmdArgs, "--runtime", c.String("runtime")) + } + for _, runtimeArg := range c.StringSlice("runtime-flag") { + budCmdArgs = append(budCmdArgs, "--runtime-flag", runtimeArg) + } + if c.IsSet("signature-policy") { + budCmdArgs = append(budCmdArgs, "--signature-policy", c.String("signature-policy")) + } + for _, tagArg := range c.StringSlice("tag") { + budCmdArgs = append(budCmdArgs, "--tag", tagArg) + } + if c.IsSet("tls-verify") { + tlsParam := "--tls-verify=" + strconv.FormatBool(c.Bool("tls-verify")) + budCmdArgs = append(budCmdArgs, tlsParam) + } + + if len(c.Args()) > 0 { + budCmdArgs = append(budCmdArgs, c.Args()...) + } + + buildah := "buildah" + + if _, err := exec.LookPath(buildah); err != nil { + return errors.Wrapf(err, "buildah not found in PATH") + } + if _, err := exec.Command(buildah).Output(); err != nil { + return errors.Wrapf(err, "buildah is not operational on this server") + } + + cmd := exec.Command(buildah, budCmdArgs...) + + cmd.Stdin = os.Stdin + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + + if err := cmd.Run(); err != nil { + return errors.Wrapf(err, "error running the buildah build-using-dockerfile (bud) command") + } + + return nil +} diff --git a/cmd/podman/main.go b/cmd/podman/main.go index d3cb86798..011303349 100644 --- a/cmd/podman/main.go +++ b/cmd/podman/main.go @@ -36,6 +36,7 @@ func main() { app.Commands = []cli.Command{ attachCommand, commitCommand, + buildCommand, createCommand, diffCommand, execCommand, |