mirror of
https://github.com/jesseduffield/lazydocker.git
synced 2026-07-21 23:01:03 +00:00
Get container details immediately after getting containers
Previously we separately obtained container details every second, meaning there was a second of not knowing whether a given container was using a TTY or not, and that meant we were using the wrong streaming method for logs, which led to a black screen.
This commit is contained in:
parent
a6ade7e78d
commit
bca15cf6b1
3 changed files with 30 additions and 14 deletions
|
|
@ -140,7 +140,9 @@ func (c *Container) RenderTop(ctx context.Context) (string, error) {
|
|||
return utils.RenderTable(append([][]string{result.Titles}, result.Processes...))
|
||||
}
|
||||
|
||||
// DetailsLoaded tells us whether we have yet loaded the details for a container. Because this is an asynchronous operation, sometimes we have the container before we have its details.
|
||||
// DetailsLoaded tells us whether we have yet loaded the details for a container.
|
||||
// Sometimes it takes some time for a container to have its details loaded
|
||||
// after it starts.
|
||||
func (c *Container) DetailsLoaded() bool {
|
||||
return c.Details.ContainerJSONBase != nil
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ import (
|
|||
"os"
|
||||
"os/exec"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
cliconfig "github.com/docker/cli/cli/config"
|
||||
|
|
@ -209,7 +210,7 @@ func (c *DockerCommand) GetContainers(existingContainers []*Container) ([]*Conta
|
|||
for i, container := range containers {
|
||||
var newContainer *Container
|
||||
|
||||
// check if we already data stored against the container
|
||||
// check if we already have data stored against the container
|
||||
for _, existingContainer := range existingContainers {
|
||||
if existingContainer.ID == container.ID {
|
||||
newContainer = existingContainer
|
||||
|
|
@ -244,6 +245,8 @@ func (c *DockerCommand) GetContainers(existingContainers []*Container) ([]*Conta
|
|||
ownContainers[i] = newContainer
|
||||
}
|
||||
|
||||
c.SetContainerDetails(ownContainers)
|
||||
|
||||
return ownContainers, nil
|
||||
}
|
||||
|
||||
|
|
@ -278,24 +281,35 @@ func (c *DockerCommand) GetServices() ([]*Service, error) {
|
|||
return services, nil
|
||||
}
|
||||
|
||||
// UpdateContainerDetails attaches the details returned from docker inspect to each of the containers
|
||||
// this contains a bit more info than what you get from the go-docker client
|
||||
func (c *DockerCommand) UpdateContainerDetails(containers []*Container) error {
|
||||
func (c *DockerCommand) RefreshContainerDetails(containers []*Container) error {
|
||||
c.ContainerMutex.Lock()
|
||||
defer c.ContainerMutex.Unlock()
|
||||
|
||||
for _, container := range containers {
|
||||
details, err := c.Client.ContainerInspect(context.Background(), container.ID)
|
||||
if err != nil {
|
||||
c.Log.Error(err)
|
||||
} else {
|
||||
container.Details = details
|
||||
}
|
||||
}
|
||||
c.SetContainerDetails(containers)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Attaches the details returned from docker inspect to each of the containers
|
||||
// this contains a bit more info than what you get from the go-docker client
|
||||
func (c *DockerCommand) SetContainerDetails(containers []*Container) {
|
||||
wg := sync.WaitGroup{}
|
||||
for _, container := range containers {
|
||||
container := container
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
details, err := c.Client.ContainerInspect(context.Background(), container.ID)
|
||||
if err != nil {
|
||||
c.Log.Error(err)
|
||||
} else {
|
||||
container.Details = details
|
||||
}
|
||||
wg.Done()
|
||||
}()
|
||||
}
|
||||
wg.Wait()
|
||||
}
|
||||
|
||||
// ViewAllLogs attaches to a subprocess viewing all the logs from docker-compose
|
||||
func (c *DockerCommand) ViewAllLogs() (*exec.Cmd, error) {
|
||||
cmd := c.OSCommand.ExecutableFromString(
|
||||
|
|
|
|||
|
|
@ -294,7 +294,7 @@ func (gui *Gui) setPanels() {
|
|||
}
|
||||
|
||||
func (gui *Gui) updateContainerDetails() error {
|
||||
return gui.DockerCommand.UpdateContainerDetails(gui.Panels.Containers.List.GetAllItems())
|
||||
return gui.DockerCommand.RefreshContainerDetails(gui.Panels.Containers.List.GetAllItems())
|
||||
}
|
||||
|
||||
func (gui *Gui) refresh() {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue