From e21f4f9996b332c3a723548ac8e246c6cb79c4a8 Mon Sep 17 00:00:00 2001 From: Vincent Demeester Date: Fri, 18 Nov 2016 15:09:13 +0100 Subject: [PATCH] Add support for healthcheck in composefile v3 `docker stack deploy` now supports a composefile v3 format that have a healthcheck. Signed-off-by: Vincent Demeester --- command/stack/deploy.go | 49 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/command/stack/deploy.go b/command/stack/deploy.go index 683f0cad35..13b43a78bf 100644 --- a/command/stack/deploy.go +++ b/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" @@ -487,6 +489,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, @@ -499,6 +506,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, @@ -531,6 +539,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 {