diff --git a/plugins/common/docker.go b/plugins/common/docker.go index 492e754c6..42fe0cb93 100644 --- a/plugins/common/docker.go +++ b/plugins/common/docker.go @@ -7,6 +7,7 @@ import ( "io/ioutil" "os" "strings" + "time" "github.com/codeskyblue/go-sh" ) @@ -45,6 +46,18 @@ func ContainerExists(containerID string) bool { return true } +// ContainerWaitTilReady will wait timeout seconds and then check if a container is running +// returning an error if it is not running at the end of the timeout +func ContainerWaitTilReady(containerID string, timeout time.Duration) error { + time.Sleep(timeout) + + if !ContainerIsRunning(containerID) { + return fmt.Errorf("Container %s is not running", containerID) + } + + return nil +} + // CopyFromImage copies a file from named image to destination func CopyFromImage(appName string, image string, source string, destination string) error { if !VerifyImage(image) { diff --git a/plugins/logs/subcommands.go b/plugins/logs/subcommands.go index 06b25aaf8..483d1baeb 100644 --- a/plugins/logs/subcommands.go +++ b/plugins/logs/subcommands.go @@ -5,6 +5,7 @@ import ( "fmt" "path/filepath" "strconv" + "time" "github.com/dokku/dokku/plugins/common" ) @@ -108,19 +109,28 @@ func CommandVectorStart(vectorImage string) error { return err } - if !common.ContainerExists(vectorContainerName) { - return startVectorContainer(vectorImage) + if common.ContainerExists(vectorContainerName) { + if common.ContainerIsRunning(vectorContainerName) { + common.LogVerbose("Vector container is running") + return nil + } + + common.LogVerbose("Starting vector container") + if !common.ContainerStart(vectorContainerName) { + return errors.New("Unable to start vector container") + } + } else { + if err := startVectorContainer(vectorImage); err != nil { + return err + } } - if common.ContainerIsRunning(vectorContainerName) { - common.LogVerbose("Container already running") - return nil - } - - if !common.ContainerStart(vectorContainerName) { - return errors.New("Unable to start vector container") + common.LogVerbose("Waiting for 10 seconds") + if err := common.ContainerWaitTilReady(vectorContainerName, 10*time.Second); err != nil { + return errors.New("Vector container did not start properly, run logs:vector-logs for more details") } + common.LogVerbose("Vector container is running") return nil }