diff --git a/pkg/client/host.go b/pkg/client/host.go index bee8d8d7..b0382418 100644 --- a/pkg/client/host.go +++ b/pkg/client/host.go @@ -79,9 +79,16 @@ func GetHostIP(ctx context.Context, runtime runtimes.Runtime, cluster *k3d.Clust return nil, fmt.Errorf("failed to ensure that k3d-tools node is running to get host IP :%w", err) } - ip, err := resolveHostnameFromInside(ctx, runtime, toolsNode, "host.docker.internal", ResolveHostCmdGetEnt) + k3dInternalIP, err := resolveHostnameFromInside(ctx, runtime, toolsNode, k3d.DefaultK3dInternalHostRecord, ResolveHostCmdGetEnt) if err == nil { - return ip, nil + return k3dInternalIP, nil + } + + l.Log().Debugf("[GetHostIP on Docker Desktop] failed to resolve '%s' from inside the k3d-tools node: %v", k3d.DefaultK3dInternalHostRecord, err) + + dockerInternalIP, err := resolveHostnameFromInside(ctx, runtime, toolsNode, "host.docker.internal", ResolveHostCmdGetEnt) + if err == nil { + return dockerInternalIP, nil } l.Log().Debugf("[GetHostIP on Docker Desktop] failed to resolve 'host.docker.internal' from inside the k3d-tools node: %v", err) diff --git a/pkg/client/tools.go b/pkg/client/tools.go index bb3348c7..85ea93a0 100644 --- a/pkg/client/tools.go +++ b/pkg/client/tools.go @@ -25,7 +25,6 @@ package client import ( "context" "fmt" - "golang.org/x/sync/errgroup" "io" "os" "path" @@ -33,6 +32,8 @@ import ( "sync" "time" + "golang.org/x/sync/errgroup" + l "github.com/rancher/k3d/v5/pkg/logger" "github.com/rancher/k3d/v5/pkg/runtimes" k3d "github.com/rancher/k3d/v5/pkg/types" @@ -385,6 +386,7 @@ func runToolsNode(ctx context.Context, runtime runtimes.Runtime, cluster *k3d.Cl Cmd: []string{}, Args: []string{"noop"}, RuntimeLabels: labels, + ExtraHosts: []string{fmt.Sprintf("%s:host-gateway", k3d.DefaultK3dInternalHostRecord)}, } node.RuntimeLabels[k3d.LabelClusterName] = cluster.Name if err := NodeRun(ctx, runtime, node, k3d.NodeCreateOpts{}); err != nil { diff --git a/pkg/runtimes/docker/node.go b/pkg/runtimes/docker/node.go index 820ddc58..f9399d48 100644 --- a/pkg/runtimes/docker/node.go +++ b/pkg/runtimes/docker/node.go @@ -24,6 +24,7 @@ package docker import ( "bufio" + "bytes" "context" "errors" "fmt" @@ -313,13 +314,20 @@ func (d Docker) ExecInNodeGetLogs(ctx context.Context, node *k3d.Node, cmd []str if resp != nil { defer resp.Close() } - if err != nil { - if resp != nil && resp.Reader != nil { // sometimes the exec process returns with a non-zero exit code, but we still have the logs we - return resp.Reader, err + + var logreader *bufio.Reader // backwards compatibility: TODO:(breaking) remove in future major version and return simple byte array or reader + + if resp != nil && resp.Reader != nil { + logs, err := io.ReadAll(resp.Reader) + if err != nil { + return nil, fmt.Errorf("error reading logs from exec process in node %s: %w", node.Name, err) } - return nil, err + lr := bytes.NewReader(logs) + logreader = bufio.NewReader(lr) + resp.Close() } - return resp.Reader, nil + + return logreader, err } // GetImageStream creates a tar stream for the given images, to be read (and closed) by the caller diff --git a/pkg/types/types.go b/pkg/types/types.go index 7c877c1c..bb0f5d90 100644 --- a/pkg/types/types.go +++ b/pkg/types/types.go @@ -200,7 +200,7 @@ var ImportModes = map[string]ImportMode{ type ImageImportOpts struct { KeepTar bool KeepToolsNode bool - Mode ImportMode + Mode ImportMode } type IPAM struct {