diff --git a/cmd/formatter/shortcut.go b/cmd/formatter/shortcut.go index 079cd1a01..206632a4f 100644 --- a/cmd/formatter/shortcut.go +++ b/cmd/formatter/shortcut.go @@ -22,6 +22,7 @@ import ( "fmt" "math" "os" + "strings" "syscall" "time" @@ -90,6 +91,7 @@ const ( type LogKeyboard struct { kError KeyboardError Watch *KeyboardWatch + Detach func() IsDockerDesktopActive bool logLevel KEYBOARD_LOG_LEVEL signalChannel chan<- os.Signal @@ -161,29 +163,23 @@ func (lk *LogKeyboard) printNavigationMenu() { } func (lk *LogKeyboard) navigationMenu() string { - var openDDInfo string + var items []string if lk.IsDockerDesktopActive { - openDDInfo = shortcutKeyColor("v") + navColor(" View in Docker Desktop") + items = append(items, shortcutKeyColor("v")+navColor(" View in Docker Desktop")) } - var openDDUI string - if openDDInfo != "" { - openDDUI = navColor(" ") - } if lk.IsDockerDesktopActive { - openDDUI = openDDUI + shortcutKeyColor("o") + navColor(" View Config") + items = append(items, shortcutKeyColor("o")+navColor(" View Config")) } - var watchInfo string - if openDDInfo != "" || openDDUI != "" { - watchInfo = navColor(" ") - } isEnabled := " Enable" if lk.Watch != nil && lk.Watch.Watching { isEnabled = " Disable" } - watchInfo = watchInfo + shortcutKeyColor("w") + navColor(isEnabled+" Watch") - return openDDInfo + openDDUI + watchInfo + items = append(items, shortcutKeyColor("w")+navColor(isEnabled+" Watch")) + items = append(items, shortcutKeyColor("d")+navColor(" Detach")) + + return strings.Join(items, " ") } func (lk *LogKeyboard) clearNavigationMenu() { @@ -290,6 +286,9 @@ func (lk *LogKeyboard) ToggleWatch(ctx context.Context, options api.UpOptions) { func (lk *LogKeyboard) HandleKeyEvents(ctx context.Context, event keyboard.KeyEvent, project *types.Project, options api.UpOptions) { switch kRune := event.Rune; kRune { + case 'd': + lk.clearNavigationMenu() + lk.Detach() case 'v': lk.openDockerDesktop(ctx, project) case 'w': @@ -336,6 +335,10 @@ func (lk *LogKeyboard) EnableWatch(enabled bool, watcher Feature) { } } +func (lk *LogKeyboard) EnableDetach(detach func()) { + lk.Detach = detach +} + func allocateSpace(lines int) { for i := 0; i < lines; i++ { clearLine() diff --git a/pkg/compose/attach.go b/pkg/compose/attach.go index 897c47331..6886ce821 100644 --- a/pkg/compose/attach.go +++ b/pkg/compose/attach.go @@ -152,11 +152,12 @@ func (s *composeService) getContainerStreams(ctx context.Context, container stri var stdout io.ReadCloser var stdin io.WriteCloser cnx, err := s.apiClient().ContainerAttach(ctx, container, containerType.AttachOptions{ - Stream: true, - Stdin: true, - Stdout: true, - Stderr: true, - Logs: false, + Stream: true, + Stdin: true, + Stdout: true, + Stderr: true, + Logs: false, + DetachKeys: s.configFile().DetachKeys, }) if err == nil { stdout = ContainerStdout{HijackedResponse: cnx} diff --git a/pkg/compose/attach_service.go b/pkg/compose/attach_service.go index 3dbf37c7e..5d4321a10 100644 --- a/pkg/compose/attach_service.go +++ b/pkg/compose/attach_service.go @@ -31,8 +31,13 @@ func (s *composeService) Attach(ctx context.Context, projectName string, options return err } + detachKeys := options.DetachKeys + if detachKeys == "" { + detachKeys = s.configFile().DetachKeys + } + var attach container.AttachOptions - attach.DetachKeys = options.DetachKeys + attach.DetachKeys = detachKeys attach.NoStdin = options.NoStdin attach.Proxy = options.Proxy return container.RunAttach(ctx, s.dockerCli, target.ID, &attach) diff --git a/pkg/compose/run.go b/pkg/compose/run.go index 2e0ba9658..f530a0aea 100644 --- a/pkg/compose/run.go +++ b/pkg/compose/run.go @@ -49,6 +49,7 @@ func (s *composeService) RunOneOffContainer(ctx context.Context, project *types. OpenStdin: !opts.Detach && opts.Interactive, Attach: !opts.Detach, Containers: []string{containerID}, + DetachKeys: s.configFile().DetachKeys, }) var stErr cli.StatusError if errors.As(err, &stErr) { diff --git a/pkg/compose/up.go b/pkg/compose/up.go index 132036741..9e4da70a8 100644 --- a/pkg/compose/up.go +++ b/pkg/compose/up.go @@ -107,6 +107,10 @@ func (s *composeService) Up(ctx context.Context, project *types.Project, options globalCtx, cancel := context.WithCancel(ctx) defer cancel() + if navigationMenu != nil { + navigationMenu.EnableDetach(cancel) + } + var ( eg errgroup.Group mu sync.Mutex diff --git a/pkg/compose/watch.go b/pkg/compose/watch.go index 4b3fe0c13..c1cf675cb 100644 --- a/pkg/compose/watch.go +++ b/pkg/compose/watch.go @@ -597,6 +597,7 @@ func (s *composeService) exec(ctx context.Context, project *types.Project, servi exec.Privileged = x.Privileged exec.Command = x.Command exec.Workdir = x.WorkingDir + exec.DetachKeys = s.configFile().DetachKeys for _, v := range x.Environment.ToMapping().Values() { err := exec.Env.Set(v) if err != nil {