cmd/pkg: Add the ability to pass a build context to docker

This commit adds the ability to add a build context to
docker for the package build. The build context is passed
on stdin to the docker process.

Signed-off-by: Rolf Neugebauer <rolf.neugebauer@docker.com>
This commit is contained in:
Rolf Neugebauer 2018-07-25 13:24:35 +01:00
parent ba4d1c79b0
commit b03288f5b4

View File

@ -6,10 +6,12 @@ package pkglib
import ( import (
"fmt" "fmt"
"io"
"os" "os"
"os/exec" "os/exec"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"golang.org/x/sync/errgroup"
) )
const dctEnableEnv = "DOCKER_CONTENT_TRUST=1" const dctEnableEnv = "DOCKER_CONTENT_TRUST=1"
@ -17,6 +19,14 @@ const dctEnableEnv = "DOCKER_CONTENT_TRUST=1"
type dockerRunner struct { type dockerRunner struct {
dct bool dct bool
cache bool cache bool
// Optional build context to use
ctx buildContext
}
type buildContext interface {
// Copy copies the build context to the supplied WriterCloser
Copy(io.WriteCloser) error
} }
func newDockerRunner(dct, cache bool) dockerRunner { func newDockerRunner(dct, cache bool) dockerRunner {
@ -52,6 +62,8 @@ func (dr dockerRunner) command(args ...string) error {
dct = dctEnableEnv + " " dct = dctEnableEnv + " "
} }
var eg errgroup.Group
if args[0] == "build" { if args[0] == "build" {
buildArgs := []string{} buildArgs := []string{}
for _, proxyVarName := range proxyEnvVars { for _, proxyVarName := range proxyEnvVars {
@ -61,15 +73,30 @@ func (dr dockerRunner) command(args ...string) error {
} }
} }
cmd.Args = append(append(cmd.Args[:2], buildArgs...), cmd.Args[2:]...) cmd.Args = append(append(cmd.Args[:2], buildArgs...), cmd.Args[2:]...)
if dr.ctx != nil {
stdin, err := cmd.StdinPipe()
if err != nil {
return err
}
eg.Go(func() error {
defer stdin.Close()
return dr.ctx.Copy(stdin)
})
cmd.Args = append(cmd.Args[:len(cmd.Args)-1], "-")
}
} }
log.Debugf("Executing: %s%v", dct, cmd.Args) log.Debugf("Executing: %s%v", dct, cmd.Args)
err := cmd.Run() if err := cmd.Run(); err != nil {
if isExecErrNotFound(err) { if isExecErrNotFound(err) {
return fmt.Errorf("linuxkit pkg requires docker to be installed") return fmt.Errorf("linuxkit pkg requires docker to be installed")
}
return err
} }
return err return eg.Wait()
} }
func (dr dockerRunner) pull(img string) (bool, error) { func (dr dockerRunner) pull(img string) (bool, error) {