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"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/containerd/console"
|
"github.com/containerd/console"
|
||||||
"github.com/containerd/containerd/platforms"
|
"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 != "" {
|
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 {
|
} 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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -257,3 +266,16 @@ func bakeCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
|
|||||||
|
|
||||||
return cmd
|
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,
|
testBakeLocal,
|
||||||
testBakeRemote,
|
testBakeRemote,
|
||||||
testBakeRemoteCmdContext,
|
testBakeRemoteCmdContext,
|
||||||
|
testBakeRemoteLocalOverride,
|
||||||
testBakeRemoteCmdContextOverride,
|
testBakeRemoteCmdContextOverride,
|
||||||
testBakeRemoteContextSubdir,
|
testBakeRemoteContextSubdir,
|
||||||
testBakeRemoteCmdContextEscapeRoot,
|
testBakeRemoteCmdContextEscapeRoot,
|
||||||
@@ -48,6 +49,11 @@ target "default" {
|
|||||||
require.NoError(t, err, out)
|
require.NoError(t, err, out)
|
||||||
|
|
||||||
require.FileExists(t, filepath.Join(dirDest, "foo"))
|
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) {
|
func testBakeRemote(t *testing.T, sb integration.Sandbox) {
|
||||||
@@ -80,6 +86,48 @@ EOT
|
|||||||
require.FileExists(t, filepath.Join(dirDest, "foo"))
|
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) {
|
func testBakeRemoteCmdContext(t *testing.T, sb integration.Sandbox) {
|
||||||
bakefile := []byte(`
|
bakefile := []byte(`
|
||||||
target "default" {
|
target "default" {
|
||||||
|
|||||||
Reference in New Issue
Block a user