diff options
| author | OpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com> | 2020-06-17 15:36:02 -0400 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-06-17 15:36:02 -0400 | 
| commit | 70f6cf7ffa72717cb15adcf8b8e024f87e445c89 (patch) | |
| tree | 988b89d6d090559dd21dae6f1805bac072beb4f3 | |
| parent | fd184fa4a1d0bd7797de1fb062c90e1a6d56bd1e (diff) | |
| parent | 65c3a56602f50856c6d4b8df212f046d53ba52c1 (diff) | |
| download | podman-70f6cf7ffa72717cb15adcf8b8e024f87e445c89.tar.gz podman-70f6cf7ffa72717cb15adcf8b8e024f87e445c89.tar.bz2 podman-70f6cf7ffa72717cb15adcf8b8e024f87e445c89.zip  | |
Merge pull request #6634 from baude/v2buildfixes
fix misc remote build issues
| -rw-r--r-- | pkg/api/handlers/compat/images_build.go | 73 | ||||
| -rw-r--r-- | pkg/api/server/register_images.go | 6 | ||||
| -rw-r--r-- | pkg/bindings/images/images.go | 3 | ||||
| -rw-r--r-- | pkg/domain/infra/tunnel/images.go | 89 | 
4 files changed, 126 insertions, 45 deletions
diff --git a/pkg/api/handlers/compat/images_build.go b/pkg/api/handlers/compat/images_build.go index 913994f46..f967acf32 100644 --- a/pkg/api/handlers/compat/images_build.go +++ b/pkg/api/handlers/compat/images_build.go @@ -48,34 +48,34 @@ func BuildImage(w http.ResponseWriter, r *http.Request) {  	defer os.RemoveAll(anchorDir)  	query := struct { -		Dockerfile  string `schema:"dockerfile"` -		Tag         string `schema:"t"` -		ExtraHosts  string `schema:"extrahosts"` -		Remote      string `schema:"remote"` -		Quiet       bool   `schema:"q"` -		NoCache     bool   `schema:"nocache"` -		CacheFrom   string `schema:"cachefrom"` -		Pull        bool   `schema:"pull"` -		Rm          bool   `schema:"rm"` -		ForceRm     bool   `schema:"forcerm"` -		Memory      int64  `schema:"memory"` -		MemSwap     int64  `schema:"memswap"` -		CpuShares   uint64 `schema:"cpushares"`  //nolint -		CpuSetCpus  string `schema:"cpusetcpus"` //nolint -		CpuPeriod   uint64 `schema:"cpuperiod"`  //nolint -		CpuQuota    int64  `schema:"cpuquota"`   //nolint -		BuildArgs   string `schema:"buildargs"` -		ShmSize     int    `schema:"shmsize"` -		Squash      bool   `schema:"squash"` -		Labels      string `schema:"labels"` -		NetworkMode string `schema:"networkmode"` -		Platform    string `schema:"platform"` -		Target      string `schema:"target"` -		Outputs     string `schema:"outputs"` -		Registry    string `schema:"registry"` +		Dockerfile  string   `schema:"dockerfile"` +		Tag         []string `schema:"t"` +		ExtraHosts  string   `schema:"extrahosts"` +		Remote      string   `schema:"remote"` +		Quiet       bool     `schema:"q"` +		NoCache     bool     `schema:"nocache"` +		CacheFrom   string   `schema:"cachefrom"` +		Pull        bool     `schema:"pull"` +		Rm          bool     `schema:"rm"` +		ForceRm     bool     `schema:"forcerm"` +		Memory      int64    `schema:"memory"` +		MemSwap     int64    `schema:"memswap"` +		CpuShares   uint64   `schema:"cpushares"`  //nolint +		CpuSetCpus  string   `schema:"cpusetcpus"` //nolint +		CpuPeriod   uint64   `schema:"cpuperiod"`  //nolint +		CpuQuota    int64    `schema:"cpuquota"`   //nolint +		BuildArgs   string   `schema:"buildargs"` +		ShmSize     int      `schema:"shmsize"` +		Squash      bool     `schema:"squash"` +		Labels      string   `schema:"labels"` +		NetworkMode string   `schema:"networkmode"` +		Platform    string   `schema:"platform"` +		Target      string   `schema:"target"` +		Outputs     string   `schema:"outputs"` +		Registry    string   `schema:"registry"`  	}{  		Dockerfile:  "Dockerfile", -		Tag:         "", +		Tag:         []string{},  		ExtraHosts:  "",  		Remote:      "",  		Quiet:       false, @@ -107,20 +107,19 @@ func BuildImage(w http.ResponseWriter, r *http.Request) {  	}  	var ( -		// Tag is the name with optional tag... -		name = query.Tag -		tag  = "latest" +		output          string +		additionalNames []string  	) -	if strings.Contains(query.Tag, ":") { -		tokens := strings.SplitN(query.Tag, ":", 2) -		name = tokens[0] -		tag = tokens[1] +	if len(query.Tag) > 0 { +		output = query.Tag[0] +	} +	if len(query.Tag) > 1 { +		additionalNames = query.Tag[1:]  	}  	if _, found := r.URL.Query()["target"]; found { -		name = query.Target +		output = query.Target  	} -  	var buildArgs = map[string]string{}  	if _, found := r.URL.Query()["buildargs"]; found {  		if err := json.Unmarshal([]byte(query.BuildArgs), &buildArgs); err != nil { @@ -168,8 +167,8 @@ func BuildImage(w http.ResponseWriter, r *http.Request) {  		TransientMounts:                nil,  		Compression:                    archive.Gzip,  		Args:                           buildArgs, -		Output:                         name, -		AdditionalTags:                 []string{tag}, +		Output:                         output, +		AdditionalTags:                 additionalNames,  		Log: func(format string, args ...interface{}) {  			buildEvents = append(buildEvents, fmt.Sprintf(format, args...))  		}, diff --git a/pkg/api/server/register_images.go b/pkg/api/server/register_images.go index 83584d0f3..754cb1b75 100644 --- a/pkg/api/server/register_images.go +++ b/pkg/api/server/register_images.go @@ -410,7 +410,7 @@ func (s *APIServer) registerImagesHandlers(r *mux.Router) error {  	// swagger:operation POST /build compat buildImage  	// ---  	// tags: -	//  - images +	//  - images (compat)  	// summary: Create image  	// description: Build an image from the given Dockerfile(s)  	// parameters: @@ -425,7 +425,7 @@ func (s *APIServer) registerImagesHandlers(r *mux.Router) error {  	//    name: t  	//    type: string  	//    default: latest -	//    description: A name and optional tag to apply to the image in the `name:tag` format. +	//    description: A name and optional tag to apply to the image in the `name:tag` format. If you omit the tag the default latest value is assumed. You can provide several t parameters.  	//  - in: query  	//    name: extrahosts  	//    type: string @@ -1211,7 +1211,7 @@ func (s *APIServer) registerImagesHandlers(r *mux.Router) error {  	//    name: t  	//    type: string  	//    default: latest -	//    description: A name and optional tag to apply to the image in the `name:tag` format. +	//    description: A name and optional tag to apply to the image in the `name:tag` format.  If you omit the tag the default latest value is assumed. You can provide several t parameters.  	//  - in: query  	//    name: extrahosts  	//    type: string diff --git a/pkg/bindings/images/images.go b/pkg/bindings/images/images.go index 9cb6a0ac5..bc2d116f3 100644 --- a/pkg/bindings/images/images.go +++ b/pkg/bindings/images/images.go @@ -229,6 +229,9 @@ func Build(ctx context.Context, containerFiles []string, options entities.BuildO  	if t := options.Output; len(t) > 0 {  		params.Set("t", t)  	} +	for _, tag := range options.AdditionalTags { +		params.Add("t", tag) +	}  	//	TODO Remote, Quiet  	if options.NoCache {  		params.Set("nocache", "1") diff --git a/pkg/domain/infra/tunnel/images.go b/pkg/domain/infra/tunnel/images.go index 9ddc5f1a9..35189cb0a 100644 --- a/pkg/domain/infra/tunnel/images.go +++ b/pkg/domain/infra/tunnel/images.go @@ -1,10 +1,13 @@  package tunnel  import ( +	"archive/tar" +	"bytes"  	"context" +	"io"  	"io/ioutil"  	"os" -	"path" +	"path/filepath"  	"strings"  	"github.com/containers/common/pkg/config" @@ -16,6 +19,7 @@ import (  	utils2 "github.com/containers/libpod/utils"  	"github.com/containers/storage/pkg/archive"  	"github.com/pkg/errors" +	"github.com/sirupsen/logrus"  )  func (ir *ImageEngine) Exists(_ context.Context, nameOrID string) (*entities.BoolReport, error) { @@ -276,14 +280,27 @@ func (ir *ImageEngine) Config(_ context.Context) (*config.Config, error) {  }  func (ir *ImageEngine) Build(ctx context.Context, containerFiles []string, opts entities.BuildOptions) (*entities.BuildReport, error) { -	if len(containerFiles) > 1 { -		return nil, errors.New("something") +	var tarReader io.Reader +	tarfile, err := archive.Tar(opts.ContextDirectory, 0) +	if err != nil { +		return nil, err  	} -	tarfile, err := archive.Tar(path.Base(containerFiles[0]), 0) +	tarReader = tarfile +	cwd, err := os.Getwd()  	if err != nil {  		return nil, err  	} -	return images.Build(ir.ClientCxt, containerFiles, opts, tarfile) +	if cwd != opts.ContextDirectory { +		fn := func(h *tar.Header, r io.Reader) (data []byte, update bool, skip bool, err error) { +			h.Name = filepath.Join(filepath.Base(opts.ContextDirectory), h.Name) +			return nil, false, false, nil +		} +		tarReader, err = transformArchive(tarfile, false, fn) +		if err != nil { +			return nil, err +		} +	} +	return images.Build(ir.ClientCxt, containerFiles, opts, tarReader)  }  func (ir *ImageEngine) Tree(ctx context.Context, nameOrID string, opts entities.ImageTreeOptions) (*entities.ImageTreeReport, error) { @@ -297,3 +314,65 @@ func (ir *ImageEngine) Shutdown(_ context.Context) {  func (ir *ImageEngine) Sign(ctx context.Context, names []string, options entities.SignOptions) (*entities.SignReport, error) {  	return nil, errors.New("not implemented yet")  } + +// Sourced from openshift image builder + +// TransformFileFunc is given a chance to transform an arbitrary input file. +type TransformFileFunc func(h *tar.Header, r io.Reader) (data []byte, update bool, skip bool, err error) + +// filterArchive transforms the provided input archive to a new archive, +// giving the fn a chance to transform arbitrary files. +func filterArchive(r io.Reader, w io.Writer, fn TransformFileFunc) error { +	tr := tar.NewReader(r) +	tw := tar.NewWriter(w) + +	var body io.Reader = tr + +	for { +		h, err := tr.Next() +		if err == io.EOF { +			return tw.Close() +		} +		if err != nil { +			return err +		} + +		name := h.Name +		data, ok, skip, err := fn(h, tr) +		logrus.Debugf("Transform %q -> %q: data=%t ok=%t skip=%t err=%v", name, h.Name, data != nil, ok, skip, err) +		if err != nil { +			return err +		} +		if skip { +			continue +		} +		if ok { +			h.Size = int64(len(data)) +			body = bytes.NewBuffer(data) +		} +		if err := tw.WriteHeader(h); err != nil { +			return err +		} +		if _, err := io.Copy(tw, body); err != nil { +			return err +		} +	} +} + +func transformArchive(r io.Reader, compressed bool, fn TransformFileFunc) (io.Reader, error) { +	var cwe error +	pr, pw := io.Pipe() +	go func() { +		if compressed { +			in, err := archive.DecompressStream(r) +			if err != nil { +				cwe = pw.CloseWithError(err) +				return +			} +			r = in +		} +		err := filterArchive(r, pw, fn) +		cwe = pw.CloseWithError(err) +	}() +	return pr, cwe +}  | 
