Skip to content

Commit 60f2dd4

Browse files
Groysman881Гройсман Даниил
authored and
Гройсман Даниил
committed
Add project name to docker command
Determing docker compose project name provides the ability to work with services of each docker compose project separately in various Lazydocker instances, even if services have the same names Determing project name is only available if name explicitly specified in docker compose project config (docker compose v2)
1 parent bedde4a commit 60f2dd4

File tree

2 files changed

+40
-5
lines changed

2 files changed

+40
-5
lines changed

pkg/commands/docker.go

+32-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
ctxstore "github.com/docker/cli/cli/context/store"
1919
"github.com/docker/docker/api/types/container"
2020
"github.com/docker/docker/client"
21+
"github.com/goccy/go-yaml"
2122
"github.com/imdario/mergo"
2223
"github.com/jesseduffield/lazydocker/pkg/commands/ssh"
2324
"github.com/jesseduffield/lazydocker/pkg/config"
@@ -40,6 +41,7 @@ type DockerCommand struct {
4041
Config *config.AppConfig
4142
Client *client.Client
4243
InDockerComposeProject bool
44+
ProjectName string
4345
ErrorChan chan error
4446
ContainerMutex deadlock.Mutex
4547
ServiceMutex deadlock.Mutex
@@ -124,6 +126,17 @@ func NewDockerCommand(log *logrus.Entry, osCommand *OSCommand, tr *i18n.Translat
124126
if err != nil {
125127
dockerCommand.InDockerComposeProject = false
126128
log.Warn(err.Error())
129+
} else {
130+
composeCommand := config.UserConfig.CommandTemplates.DockerCompose
131+
yamlDockerComposeConfig, err := osCommand.RunCommandWithOutput(fmt.Sprintf("%s config --format=yaml", composeCommand))
132+
133+
if err == nil {
134+
dockerCommand.ProjectName, err = determineProjectName(yamlDockerComposeConfig)
135+
}
136+
137+
if err != nil {
138+
log.Warn(err.Error())
139+
}
127140
}
128141

129142
return dockerCommand, nil
@@ -208,7 +221,7 @@ func (c *DockerCommand) assignContainersToServices(containers []*Container, serv
208221
L:
209222
for _, service := range services {
210223
for _, ctr := range containers {
211-
if !ctr.OneOff && ctr.ServiceName == service.Name {
224+
if !ctr.OneOff && ctr.ServiceName == service.Name && (c.ProjectName == "" || ctr.ProjectName == c.ProjectName) {
212225
service.Container = ctr
213226
continue L
214227
}
@@ -360,6 +373,24 @@ func (c *DockerCommand) DockerComposeConfig() string {
360373
return output
361374
}
362375

376+
// determineProjectName tries to the determine the docker compose project name
377+
func determineProjectName(yamlDockerComposeConfig string) (string, error) {
378+
var projectName string
379+
var config map[string]any
380+
381+
err := yaml.Unmarshal([]byte(yamlDockerComposeConfig), &config)
382+
if err != nil {
383+
return projectName, err
384+
}
385+
386+
projectName, ok := config["name"].(string)
387+
if !ok {
388+
return projectName, fmt.Errorf("Incorrect value of docker compose project name in config: %s", config["name"])
389+
}
390+
391+
return projectName, nil
392+
}
393+
363394
// determineDockerHost tries to the determine the docker host that we should connect to
364395
// in the following order of decreasing precedence:
365396
// - value of "DOCKER_HOST" environment variable

pkg/gui/project_panel.go

+8-4
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,14 @@ func (gui *Gui) refreshProject() error {
8080
func (gui *Gui) getProjectName() string {
8181
projectName := path.Base(gui.Config.ProjectDir)
8282
if gui.DockerCommand.InDockerComposeProject {
83-
for _, service := range gui.Panels.Services.List.GetAllItems() {
84-
container := service.Container
85-
if container != nil && container.DetailsLoaded() {
86-
return container.Details.Config.Labels["com.docker.compose.project"]
83+
if gui.DockerCommand.ProjectName != "" {
84+
return gui.DockerCommand.ProjectName
85+
} else {
86+
for _, service := range gui.Panels.Services.List.GetAllItems() {
87+
container := service.Container
88+
if container != nil && container.DetailsLoaded() {
89+
return container.Details.Config.Labels["com.docker.compose.project"]
90+
}
8791
}
8892
}
8993
}

0 commit comments

Comments
 (0)