This commit is contained in:
Groysman881 2026-01-17 11:09:46 -06:00 committed by GitHub
commit 5fac94a771
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 40 additions and 5 deletions

View file

@ -18,6 +18,7 @@ import (
ctxstore "github.com/docker/cli/cli/context/store"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/client"
"github.com/goccy/go-yaml"
"github.com/imdario/mergo"
"github.com/jesseduffield/lazydocker/pkg/commands/ssh"
"github.com/jesseduffield/lazydocker/pkg/config"
@ -39,6 +40,7 @@ type DockerCommand struct {
Config *config.AppConfig
Client *client.Client
InDockerComposeProject bool
ProjectName string
ErrorChan chan error
ContainerMutex deadlock.Mutex
ServiceMutex deadlock.Mutex
@ -138,6 +140,17 @@ func NewDockerCommand(log *logrus.Entry, osCommand *OSCommand, tr *i18n.Translat
if err != nil {
dockerCommand.InDockerComposeProject = false
log.Warn(err.Error())
} else {
composeCommand := config.UserConfig.CommandTemplates.DockerCompose
yamlDockerComposeConfig, err := osCommand.RunCommandWithOutput(fmt.Sprintf("%s config --format=yaml", composeCommand))
if err == nil {
dockerCommand.ProjectName, err = determineProjectName(yamlDockerComposeConfig)
}
if err != nil {
log.Warn(err.Error())
}
}
return dockerCommand, nil
@ -222,7 +235,7 @@ func (c *DockerCommand) assignContainersToServices(containers []*Container, serv
L:
for _, service := range services {
for _, ctr := range containers {
if !ctr.OneOff && ctr.ServiceName == service.Name {
if !ctr.OneOff && ctr.ServiceName == service.Name && (c.ProjectName == "" || ctr.ProjectName == c.ProjectName) {
service.Container = ctr
continue L
}
@ -378,6 +391,24 @@ func (c *DockerCommand) DockerComposeConfig() string {
return output
}
// determineProjectName tries to the determine the docker compose project name
func determineProjectName(yamlDockerComposeConfig string) (string, error) {
var projectName string
var config map[string]any
err := yaml.Unmarshal([]byte(yamlDockerComposeConfig), &config)
if err != nil {
return projectName, err
}
projectName, ok := config["name"].(string)
if !ok {
return projectName, fmt.Errorf("Incorrect value of docker compose project name in config: %s", config["name"])
}
return projectName, nil
}
// determineDockerHost tries to the determine the docker host that we should connect to
// in the following order of decreasing precedence:
// - value of "DOCKER_HOST" environment variable

View file

@ -80,10 +80,14 @@ func (gui *Gui) refreshProject() error {
func (gui *Gui) getProjectName() string {
projectName := path.Base(gui.Config.ProjectDir)
if gui.DockerCommand.InDockerComposeProject {
for _, service := range gui.Panels.Services.List.GetAllItems() {
container := service.Container
if container != nil && container.DetailsLoaded() {
return container.Details.Config.Labels["com.docker.compose.project"]
if gui.DockerCommand.ProjectName != "" {
return gui.DockerCommand.ProjectName
} else {
for _, service := range gui.Panels.Services.List.GetAllItems() {
container := service.Container
if container != nil && container.DetailsLoaded() {
return container.Details.Config.Labels["com.docker.compose.project"]
}
}
}
}