diff --git a/cli/command/stack/deploy.go b/cli/command/stack/deploy.go index ee19741355..b0aaa290b6 100644 --- a/cli/command/stack/deploy.go +++ b/cli/command/stack/deploy.go @@ -6,6 +6,7 @@ import ( "os" "sort" "strings" + "time" "github.com/spf13/cobra" "golang.org/x/net/context" @@ -13,6 +14,7 @@ import ( "github.com/aanand/compose-file/loader" composetypes "github.com/aanand/compose-file/types" "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/mount" networktypes "github.com/docker/docker/api/types/network" "github.com/docker/docker/api/types/swarm" @@ -492,6 +494,11 @@ func convertService( return swarm.ServiceSpec{}, err } + healthcheck, err := convertHealthcheck(service.HealthCheck) + if err != nil { + return swarm.ServiceSpec{}, err + } + serviceSpec := swarm.ServiceSpec{ Annotations: swarm.Annotations{ Name: name, @@ -504,6 +511,7 @@ func convertService( Args: service.Command, Hostname: service.Hostname, Hosts: convertExtraHosts(service.ExtraHosts), + Healthcheck: healthcheck, Env: convertEnvironment(service.Environment), Labels: getStackLabels(namespace.name, service.Labels), Dir: service.WorkingDir, @@ -536,6 +544,47 @@ func convertExtraHosts(extraHosts map[string]string) []string { return hosts } +func convertHealthcheck(healthcheck *composetypes.HealthCheckConfig) (*container.HealthConfig, error) { + if healthcheck == nil { + return nil, nil + } + var ( + err error + timeout, interval time.Duration + retries int + ) + if healthcheck.Disable { + if len(healthcheck.Test) != 0 { + return nil, fmt.Errorf("command and disable key can't be set at the same time") + } + return &container.HealthConfig{ + Test: []string{"NONE"}, + }, nil + + } + if healthcheck.Timeout != "" { + timeout, err = time.ParseDuration(healthcheck.Timeout) + if err != nil { + return nil, err + } + } + if healthcheck.Interval != "" { + interval, err = time.ParseDuration(healthcheck.Interval) + if err != nil { + return nil, err + } + } + if healthcheck.Retries != nil { + retries = int(*healthcheck.Retries) + } + return &container.HealthConfig{ + Test: healthcheck.Test, + Timeout: timeout, + Interval: interval, + Retries: retries, + }, nil +} + func convertRestartPolicy(restart string, source *composetypes.RestartPolicy) (*swarm.RestartPolicy, error) { // TODO: log if restart is being ignored if source == nil { diff --git a/vendor/github.com/aanand/compose-file/types/types.go b/vendor/github.com/aanand/compose-file/types/types.go index 55ee177978..5fa0a952ec 100644 --- a/vendor/github.com/aanand/compose-file/types/types.go +++ b/vendor/github.com/aanand/compose-file/types/types.go @@ -128,6 +128,7 @@ type HealthCheckConfig struct { Timeout string Interval string Retries *uint64 + Disable bool } type UpdateConfig struct {