command(bake): Specify local and remote bake files
This adds the ability to source additional local build definition files when sourcing Bake files via a remote url. Prefixing a file with 'cwd://' will source a bake file on the local machine, instead of the remote location. Local files will be read/have precedence before remote files. Usage: ``` docker buildx bake https://github.com/example/upstream.git --file cwd://docker-bake.override.hcl --print ``` This will source a default file from the example/upstream repository, and also source a build definition from the local machine. Signed-off-by: Cameron Adams <pnzreba@gmail.com>
This commit is contained in:
committed by
Justin Chadwell
parent
86ae8ea854
commit
78616f2531
@@ -5,6 +5,7 @@ import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/containerd/console"
|
||||
"github.com/containerd/containerd/platforms"
|
||||
@@ -142,11 +143,19 @@ func runBake(dockerCli command.Cli, targets []string, in bakeOptions, cFlags com
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
localFilesArg, remoteFilesArg := getFilesArgs(in.files)
|
||||
if url != "" {
|
||||
files, inp, err = bake.ReadRemoteFiles(ctx, nodes, url, in.files, printer)
|
||||
files, inp, err = bake.ReadRemoteFiles(ctx, nodes, url, remoteFilesArg, printer)
|
||||
if len(localFilesArg) > 0 {
|
||||
var localFiles []bake.File
|
||||
localFiles, err = bake.ReadLocalFiles(localFilesArg, dockerCli.In())
|
||||
files = append(files, localFiles...)
|
||||
}
|
||||
} else {
|
||||
files, err = bake.ReadLocalFiles(in.files, dockerCli.In())
|
||||
var filesArg []string
|
||||
filesArg = append(filesArg, localFilesArg...)
|
||||
filesArg = append(filesArg, remoteFilesArg...)
|
||||
files, err = bake.ReadLocalFiles(filesArg, dockerCli.In())
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -257,3 +266,16 @@ func bakeCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
func getFilesArgs(s []string) ([]string, []string) {
|
||||
var localFiles []string
|
||||
var remoteFiles []string
|
||||
for _, v := range s {
|
||||
if strings.HasPrefix(v, "cwd://") {
|
||||
localFiles = append(localFiles, strings.TrimPrefix(v, "cwd://"))
|
||||
} else {
|
||||
remoteFiles = append(remoteFiles, v)
|
||||
}
|
||||
}
|
||||
return localFiles, remoteFiles
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ var bakeTests = []func(t *testing.T, sb integration.Sandbox){
|
||||
testBakeLocal,
|
||||
testBakeRemote,
|
||||
testBakeRemoteCmdContext,
|
||||
testBakeRemoteLocalOverride,
|
||||
testBakeRemoteCmdContextOverride,
|
||||
testBakeRemoteContextSubdir,
|
||||
testBakeRemoteCmdContextEscapeRoot,
|
||||
@@ -48,6 +49,11 @@ target "default" {
|
||||
require.NoError(t, err, out)
|
||||
|
||||
require.FileExists(t, filepath.Join(dirDest, "foo"))
|
||||
|
||||
out, err = bakeCmd(sb, withDir(dir), withArgs("--file", "cwd://docker-bake.hcl", "--set", "*.output=type=local,dest="+dirDest))
|
||||
require.NoError(t, err, out)
|
||||
|
||||
require.FileExists(t, filepath.Join(dirDest, "foo"))
|
||||
}
|
||||
|
||||
func testBakeRemote(t *testing.T, sb integration.Sandbox) {
|
||||
@@ -80,6 +86,48 @@ EOT
|
||||
require.FileExists(t, filepath.Join(dirDest, "foo"))
|
||||
}
|
||||
|
||||
func testBakeRemoteLocalOverride(t *testing.T, sb integration.Sandbox) {
|
||||
remoteBakefile := []byte(`
|
||||
target "default" {
|
||||
dockerfile-inline = <<EOT
|
||||
FROM scratch
|
||||
COPY foo /foo
|
||||
EOT
|
||||
}
|
||||
`)
|
||||
localBakefile := []byte(`
|
||||
target "default" {
|
||||
dockerfile-inline = <<EOT
|
||||
FROM scratch
|
||||
COPY bar /bar
|
||||
EOT
|
||||
}
|
||||
`)
|
||||
dirSpec := tmpdir(
|
||||
t,
|
||||
fstest.CreateFile("docker-bake.hcl", remoteBakefile, 0600),
|
||||
fstest.CreateFile("bar", []byte("bar"), 0600),
|
||||
)
|
||||
dirSrc := tmpdir(
|
||||
t,
|
||||
fstest.CreateFile("local-docker-bake.hcl", localBakefile, 0600),
|
||||
)
|
||||
dirDest := t.TempDir()
|
||||
|
||||
git, err := gitutil.New(gitutil.WithWorkingDir(dirSpec))
|
||||
require.NoError(t, err)
|
||||
|
||||
gitutil.GitInit(git, t)
|
||||
gitutil.GitAdd(git, t, "docker-bake.hcl", "bar")
|
||||
gitutil.GitCommit(git, t, "initial commit")
|
||||
addr := gitutil.GitServeHTTP(git, t)
|
||||
|
||||
out, err := bakeCmd(sb, withDir(dirSrc), withArgs(addr, "--file", "cwd://local-docker-bake.hcl", "--set", "*.output=type=local,dest="+dirDest))
|
||||
require.NoError(t, err, out)
|
||||
|
||||
require.FileExists(t, filepath.Join(dirDest, "bar"))
|
||||
}
|
||||
|
||||
func testBakeRemoteCmdContext(t *testing.T, sb integration.Sandbox) {
|
||||
bakefile := []byte(`
|
||||
target "default" {
|
||||
|
||||
Reference in New Issue
Block a user