You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
1.9 KiB
Go
80 lines
1.9 KiB
Go
package local
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
|
|
"github.com/containerd/console"
|
|
"github.com/docker/buildx/build"
|
|
cbuild "github.com/docker/buildx/controller/build"
|
|
"github.com/docker/buildx/controller/control"
|
|
controllerapi "github.com/docker/buildx/controller/pb"
|
|
"github.com/docker/cli/cli/command"
|
|
)
|
|
|
|
func NewLocalBuildxController(ctx context.Context, dockerCli command.Cli) control.BuildxController {
|
|
return &localController{
|
|
dockerCli: dockerCli,
|
|
ref: "local",
|
|
}
|
|
}
|
|
|
|
type localController struct {
|
|
dockerCli command.Cli
|
|
ref string
|
|
resultCtx *build.ResultContext
|
|
}
|
|
|
|
func (b *localController) Invoke(ctx context.Context, ref string, cfg controllerapi.ContainerConfig, ioIn io.ReadCloser, ioOut io.WriteCloser, ioErr io.WriteCloser) error {
|
|
if ref != b.ref {
|
|
return fmt.Errorf("unknown ref %q", ref)
|
|
}
|
|
if b.resultCtx == nil {
|
|
return fmt.Errorf("no build result is registered")
|
|
}
|
|
ccfg := build.ContainerConfig{
|
|
ResultCtx: b.resultCtx,
|
|
Entrypoint: cfg.Entrypoint,
|
|
Cmd: cfg.Cmd,
|
|
Env: cfg.Env,
|
|
Tty: cfg.Tty,
|
|
Stdin: ioIn,
|
|
Stdout: ioOut,
|
|
Stderr: ioErr,
|
|
}
|
|
if !cfg.NoUser {
|
|
ccfg.User = &cfg.User
|
|
}
|
|
if !cfg.NoCwd {
|
|
ccfg.Cwd = &cfg.Cwd
|
|
}
|
|
return build.Invoke(ctx, ccfg)
|
|
}
|
|
|
|
func (b *localController) Build(ctx context.Context, options controllerapi.BuildOptions, in io.ReadCloser, w io.Writer, out console.File, progressMode string) (string, error) {
|
|
res, err := cbuild.RunBuild(ctx, b.dockerCli, options, in, progressMode, nil)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
b.resultCtx = res
|
|
return b.ref, nil
|
|
}
|
|
|
|
func (b *localController) Kill(context.Context) error {
|
|
return nil // nop
|
|
}
|
|
|
|
func (b *localController) Close() error {
|
|
// TODO: cancel current build and invoke
|
|
return nil
|
|
}
|
|
|
|
func (b *localController) List(ctx context.Context) (res []string, _ error) {
|
|
return []string{b.ref}, nil
|
|
}
|
|
|
|
func (b *localController) Disconnect(ctx context.Context, key string) error {
|
|
return nil // nop
|
|
}
|