Merge pull request #4215 from TomSweeneyRedHat/dev/tsweeney/fixsquash

Add squash-all, fix squash option in build
This commit is contained in:
OpenShift Merge Robot
2019-10-15 12:21:17 +02:00
committed by GitHub
4 changed files with 55 additions and 2 deletions

View File

@ -17,6 +17,7 @@ import (
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
var ( var (
@ -27,6 +28,7 @@ var (
fromAndBudValues buildahcli.FromAndBudResults fromAndBudValues buildahcli.FromAndBudResults
userNSValues buildahcli.UserNSResults userNSValues buildahcli.UserNSResults
namespaceValues buildahcli.NameSpaceResults namespaceValues buildahcli.NameSpaceResults
podBuildValues cliconfig.PodmanBuildResults
_buildCommand = &cobra.Command{ _buildCommand = &cobra.Command{
Use: "build [flags] CONTEXT", Use: "build [flags] CONTEXT",
@ -40,6 +42,7 @@ var (
buildCommand.FromAndBudResults = &fromAndBudValues buildCommand.FromAndBudResults = &fromAndBudValues
buildCommand.LayerResults = &layerValues buildCommand.LayerResults = &layerValues
buildCommand.NameSpaceResults = &namespaceValues buildCommand.NameSpaceResults = &namespaceValues
buildCommand.PodmanBuildResults = &podBuildValues
buildCommand.Remote = remoteclient buildCommand.Remote = remoteclient
return buildCmd(&buildCommand) return buildCmd(&buildCommand)
}, },
@ -73,15 +76,30 @@ func init() {
logrus.Error("unable to set force-rm flag to true") logrus.Error("unable to set force-rm flag to true")
} }
flag.DefValue = "true" flag.DefValue = "true"
podmanBuildFlags := GetPodmanBuildFlags(&podBuildValues)
flag = podmanBuildFlags.Lookup("squash-all")
if err := flag.Value.Set("false"); err != nil {
logrus.Error("unable to set squash-all flag to false")
}
flag.DefValue = "true"
fromAndBugFlags := buildahcli.GetFromAndBudFlags(&fromAndBudValues, &userNSValues, &namespaceValues) fromAndBugFlags := buildahcli.GetFromAndBudFlags(&fromAndBudValues, &userNSValues, &namespaceValues)
flags.AddFlagSet(&budFlags) flags.AddFlagSet(&budFlags)
flags.AddFlagSet(&layerFlags)
flags.AddFlagSet(&fromAndBugFlags) flags.AddFlagSet(&fromAndBugFlags)
flags.AddFlagSet(&layerFlags)
flags.AddFlagSet(&podmanBuildFlags)
markFlagHidden(flags, "signature-policy") markFlagHidden(flags, "signature-policy")
} }
// GetPodmanBuildFlags flags used only by `podman build` and not by
// `buildah bud`.
func GetPodmanBuildFlags(flags *cliconfig.PodmanBuildResults) pflag.FlagSet {
fs := pflag.FlagSet{}
fs.BoolVar(&flags.SquashAll, "squash-all", false, "Squash all layers into a single layer.")
return fs
}
func getContainerfiles(files []string) []string { func getContainerfiles(files []string) []string {
var containerfiles []string var containerfiles []string
for _, f := range files { for _, f := range files {
@ -119,6 +137,12 @@ func getNsValues(c *cliconfig.BuildValues) ([]buildah.NamespaceOption, error) {
} }
func buildCmd(c *cliconfig.BuildValues) error { func buildCmd(c *cliconfig.BuildValues) error {
if (c.Flags().Changed("squash") && c.Flags().Changed("layers")) ||
(c.Flags().Changed("squash-all") && c.Flags().Changed("layers")) ||
(c.Flags().Changed("squash-all") && c.Flags().Changed("squash")) {
return fmt.Errorf("cannot specify squash, squash-all and layers options together")
}
// The following was taken directly from containers/buildah/cmd/bud.go // The following was taken directly from containers/buildah/cmd/bud.go
// TODO Find a away to vendor more of this in rather than copy from bud // TODO Find a away to vendor more of this in rather than copy from bud
output := "" output := ""
@ -293,6 +317,22 @@ func buildCmd(c *cliconfig.BuildValues) error {
Volumes: c.Volumes, Volumes: c.Volumes,
} }
// `buildah bud --layers=false` acts like `docker build --squash` does.
// That is all of the new layers created during the build process are
// condensed into one, any layers present prior to this build are retained
// without condensing. `buildah bud --squash` squashes both new and old
// layers down into one. Translate Podman commands into Buildah.
// Squash invoked, retain old layers, squash new layers into one.
if c.Flags().Changed("squash") && c.Squash {
c.Squash = false
layers = false
}
// Squash-all invoked, squash both new and old layers into one.
if c.Flags().Changed("squash-all") {
c.Squash = true
layers = false
}
options := imagebuildah.BuildOptions{ options := imagebuildah.BuildOptions{
CommonBuildOpts: &buildOpts, CommonBuildOpts: &buildOpts,
AdditionalTags: tags, AdditionalTags: tags,

View File

@ -12,13 +12,20 @@ type RunValues struct {
PodmanCommand PodmanCommand
} }
// PodmanBuildResults represents the results for Podman Build flags
// that are unique to Podman.
type PodmanBuildResults struct {
SquashAll bool
}
type BuildValues struct { type BuildValues struct {
PodmanCommand PodmanCommand
*buildahcli.BudResults *buildahcli.BudResults
*buildahcli.UserNSResults *buildahcli.UserNSResults
*buildahcli.FromAndBudResults *buildahcli.FromAndBudResults
*buildahcli.NameSpaceResults
*buildahcli.LayerResults *buildahcli.LayerResults
*buildahcli.NameSpaceResults
*PodmanBuildResults
} }
type CpValues struct { type CpValues struct {

View File

@ -1246,6 +1246,7 @@ _podman_build() {
-q -q
--rm --rm
--squash --squash
--squash-all
--tls-verify --tls-verify
" "

View File

@ -405,6 +405,11 @@ If you omit the unit, the system uses bytes. If you omit the size entirely, the
**--squash** **--squash**
Squash all of the image's new layers into a single new layer; any preexisting layers
are not squashed.
**--squash-all**
Squash all of the new image's layers (including those inherited from a base image) into a single new layer. Squash all of the new image's layers (including those inherited from a base image) into a single new layer.
**--tag**, **-t**=*imageName* **--tag**, **-t**=*imageName*