-
Notifications
You must be signed in to change notification settings - Fork 510
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: Tonis Tiigi <[email protected]>
- Loading branch information
1 parent
e2d52a8
commit fea7459
Showing
8 changed files
with
180 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
package history | ||
|
||
import ( | ||
"context" | ||
"encoding/json" | ||
"fmt" | ||
"io" | ||
"net" | ||
"net/http" | ||
"os" | ||
"strings" | ||
|
||
remoteutil "github.com/docker/buildx/driver/remote/util" | ||
"github.com/docker/buildx/util/cobrautil/completion" | ||
"github.com/docker/buildx/util/desktop" | ||
"github.com/docker/cli/cli/command" | ||
"github.com/pkg/browser" | ||
"github.com/pkg/errors" | ||
"github.com/spf13/cobra" | ||
) | ||
|
||
type importOptions struct { | ||
file string | ||
} | ||
|
||
func runImport(ctx context.Context, _ command.Cli, opts importOptions) error { | ||
sock, err := desktop.BuildServerAddr() | ||
if err != nil { | ||
return err | ||
} | ||
|
||
tr := http.DefaultTransport.(*http.Transport).Clone() | ||
tr.DialContext = func(ctx context.Context, _, _ string) (net.Conn, error) { | ||
network, addr, ok := strings.Cut(sock, "://") | ||
if !ok { | ||
return nil, errors.Errorf("invalid endpoint address: %s", sock) | ||
} | ||
return remoteutil.DialContext(ctx, network, addr) | ||
} | ||
|
||
client := &http.Client{ | ||
Transport: tr, | ||
} | ||
|
||
var rdr io.Reader = os.Stdin | ||
if opts.file != "" { | ||
f, err := os.Open(opts.file) | ||
if err != nil { | ||
return errors.Wrap(err, "failed to open file") | ||
} | ||
defer f.Close() | ||
rdr = f | ||
} | ||
|
||
req, err := http.NewRequestWithContext(ctx, http.MethodPost, "http://docker-desktop/upload", rdr) | ||
if err != nil { | ||
return errors.Wrap(err, "failed to create request") | ||
} | ||
|
||
resp, err := client.Do(req) | ||
if err != nil { | ||
return errors.Wrap(err, "failed to send request, check if Docker Desktop is running") | ||
} | ||
defer resp.Body.Close() | ||
|
||
if resp.StatusCode != http.StatusOK { | ||
body, _ := io.ReadAll(resp.Body) | ||
return errors.Errorf("failed to import build: %s", string(body)) | ||
} | ||
|
||
var refs []string | ||
dec := json.NewDecoder(resp.Body) | ||
if err := dec.Decode(&refs); err != nil { | ||
return errors.Wrap(err, "failed to decode response") | ||
} | ||
|
||
if len(refs) == 0 { | ||
return errors.New("no build records found in the bundle") | ||
} | ||
|
||
url := desktop.BuildURL(fmt.Sprintf(".imported/_/%s", refs[0])) | ||
return browser.OpenURL(url) | ||
} | ||
|
||
func importCmd(dockerCli command.Cli, _ RootOptions) *cobra.Command { | ||
var options importOptions | ||
|
||
cmd := &cobra.Command{ | ||
Use: "import [OPTIONS] < bundle.dockerbuild", | ||
Short: "Import a build into Docker Desktop", | ||
Args: cobra.NoArgs, | ||
RunE: func(cmd *cobra.Command, args []string) error { | ||
return runImport(cmd.Context(), dockerCli, options) | ||
}, | ||
ValidArgsFunction: completion.Disable, | ||
} | ||
|
||
flags := cmd.Flags() | ||
flags.StringVarP(&options.file, "file", "f", "", "Import from a file path") | ||
|
||
return cmd | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
# docker buildx history import | ||
|
||
<!---MARKER_GEN_START--> | ||
Import a build into Docker Desktop | ||
|
||
### Options | ||
|
||
| Name | Type | Default | Description | | ||
|:----------------|:---------|:--------|:-----------------------------------------| | ||
| `--builder` | `string` | | Override the configured builder instance | | ||
| `-D`, `--debug` | `bool` | | Enable debug logging | | ||
| `-f`, `--file` | `string` | | Import from a file path | | ||
|
||
|
||
<!---MARKER_GEN_END--> | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
package desktop | ||
|
||
import ( | ||
"os" | ||
"path/filepath" | ||
|
||
"github.com/pkg/errors" | ||
) | ||
|
||
const ( | ||
socketName = "docker-desktop-build.sock" | ||
socketPath = "Library/Containers/com.docker.docker/Data" | ||
) | ||
|
||
func BuildServerAddr() (string, error) { | ||
dir, err := os.UserHomeDir() | ||
if err != nil { | ||
return "", errors.Wrap(err, "failed to get user home directory") | ||
} | ||
return "unix://" + filepath.Join(dir, socketPath, socketName), nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
package desktop | ||
|
||
import ( | ||
"os" | ||
"path/filepath" | ||
|
||
"github.com/pkg/errors" | ||
) | ||
|
||
const ( | ||
socketName = "docker-desktop-build.sock" | ||
socketPath = ".docker/desktop" | ||
) | ||
|
||
func BuildServerAddr() (string, error) { | ||
dir, err := os.UserHomeDir() | ||
if err != nil { | ||
return "", errors.Wrap(err, "failed to get user home directory") | ||
} | ||
return "unix://" + filepath.Join(dir, socketPath, socketName), nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
//go:build !windows && !darwin && !linux | ||
|
||
package desktop | ||
|
||
import ( | ||
"runtime" | ||
|
||
"github.com/pkg/errors" | ||
) | ||
|
||
func BuildServerAddr() (string, error) { | ||
return "", errors.Errorf("Docker Desktop unsupported on %s", runtime.GOOS) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
package desktop | ||
|
||
func BuildServerAddr() (string, error) { | ||
return "npipe:////./pipe/dockerDesktopBuildServer", nil | ||
} |