diff --git a/internal/docker/docker.go b/internal/docker/docker.go index fedfe3a151..f11a30a1c8 100644 --- a/internal/docker/docker.go +++ b/internal/docker/docker.go @@ -190,3 +190,20 @@ func Copy(containerName, containerPath, localPath string) error { } return nil } + +// CheckDaemonRunning checks if the Docker daemon is running. +// Returns nil if the daemon is running, or an error if it's not. +func CheckDaemonRunning() error { + cmd := exec.Command("docker", "info") + errOutput := new(bytes.Buffer) + cmd.Stderr = errOutput + + logger.Debugf("running command to check Docker daemon: %s", cmd) + if err := cmd.Run(); err != nil { + daemonError := fmt.Errorf("docker daemon is not running (stderr=%q): %w", errOutput.String(), err) + logger.Error(": Docker daemon is not running or not accessible") + logger.Error(": Please make sure Docker is installed and running before executing commands that require Docker") + return daemonError + } + return nil +} diff --git a/internal/stack/compose.go b/internal/stack/compose.go index 483e638e80..e7aacd9d6e 100644 --- a/internal/stack/compose.go +++ b/internal/stack/compose.go @@ -12,6 +12,7 @@ import ( "github.com/elastic/elastic-package/internal/compose" "github.com/elastic/elastic-package/internal/docker" "github.com/elastic/elastic-package/internal/install" + "github.com/elastic/elastic-package/internal/logger" ) type ServiceStatus struct { @@ -50,7 +51,18 @@ func (eb *envBuilder) build() []string { return eb.vars } +// CheckDockerRunning verifies that the Docker daemon is running before executing Docker operations +func CheckDockerRunning() error { + logger.Debug("Checking if Docker daemon is running...") + return docker.CheckDaemonRunning() +} + func dockerComposeBuild(ctx context.Context, options Options) error { + // Check if Docker daemon is running + if err := CheckDockerRunning(); err != nil { + return err + } + c, err := compose.NewProject(DockerComposeProjectName(options.Profile), options.Profile.Path(ProfileStackPath, ComposeFile)) if err != nil { return fmt.Errorf("could not create docker compose project: %w", err) @@ -77,6 +89,11 @@ func dockerComposeBuild(ctx context.Context, options Options) error { } func dockerComposePull(ctx context.Context, options Options) error { + // Check if Docker daemon is running + if err := CheckDockerRunning(); err != nil { + return err + } + c, err := compose.NewProject(DockerComposeProjectName(options.Profile), options.Profile.Path(ProfileStackPath, ComposeFile)) if err != nil { return fmt.Errorf("could not create docker compose project: %w", err) @@ -103,6 +120,11 @@ func dockerComposePull(ctx context.Context, options Options) error { } func dockerComposeUp(ctx context.Context, options Options) error { + // Check if Docker daemon is running + if err := CheckDockerRunning(); err != nil { + return err + } + c, err := compose.NewProject(DockerComposeProjectName(options.Profile), options.Profile.Path(ProfileStackPath, ComposeFile)) if err != nil { return fmt.Errorf("could not create docker compose project: %w", err) @@ -135,6 +157,11 @@ func dockerComposeUp(ctx context.Context, options Options) error { } func dockerComposeDown(ctx context.Context, options Options) error { + // Check if Docker daemon is running + if err := CheckDockerRunning(); err != nil { + return err + } + c, err := compose.NewProject(DockerComposeProjectName(options.Profile), options.Profile.Path(ProfileStackPath, ComposeFile)) if err != nil { return fmt.Errorf("could not create docker compose project: %w", err)