mirror of https://github.com/docker/compose.git
Merge pull request #907 from docker/aci_healthcheck_threshold
This commit is contained in:
commit
38d2dd9b41
|
@ -272,7 +272,6 @@ func (s serviceConfigAciHelper) getLivenessProbe() *containerinstance.ContainerP
|
||||||
}
|
}
|
||||||
if retries != nil && *retries > 0 {
|
if retries != nil && *retries > 0 {
|
||||||
probe.FailureThreshold = retries
|
probe.FailureThreshold = retries
|
||||||
probe.SuccessThreshold = retries
|
|
||||||
}
|
}
|
||||||
return &probe
|
return &probe
|
||||||
}
|
}
|
||||||
|
@ -365,8 +364,8 @@ func ContainerGroupToContainer(containerID string, cg containerinstance.Containe
|
||||||
if cc.LivenessProbe.PeriodSeconds != nil {
|
if cc.LivenessProbe.PeriodSeconds != nil {
|
||||||
healthcheck.Interval = types.Duration(int64(*cc.LivenessProbe.PeriodSeconds) * int64(time.Second))
|
healthcheck.Interval = types.Duration(int64(*cc.LivenessProbe.PeriodSeconds) * int64(time.Second))
|
||||||
}
|
}
|
||||||
if cc.LivenessProbe.SuccessThreshold != nil {
|
if cc.LivenessProbe.FailureThreshold != nil {
|
||||||
healthcheck.Retries = int(*cc.LivenessProbe.SuccessThreshold)
|
healthcheck.Retries = int(*cc.LivenessProbe.FailureThreshold)
|
||||||
}
|
}
|
||||||
if cc.LivenessProbe.TimeoutSeconds != nil {
|
if cc.LivenessProbe.TimeoutSeconds != nil {
|
||||||
healthcheck.Timeout = types.Duration(int64(*cc.LivenessProbe.TimeoutSeconds) * int64(time.Second))
|
healthcheck.Timeout = types.Duration(int64(*cc.LivenessProbe.TimeoutSeconds) * int64(time.Second))
|
||||||
|
|
|
@ -98,7 +98,7 @@ func TestContainerGroupToContainer(t *testing.T) {
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
PeriodSeconds: to.Int32Ptr(10),
|
PeriodSeconds: to.Int32Ptr(10),
|
||||||
SuccessThreshold: to.Int32Ptr(3),
|
FailureThreshold: to.Int32Ptr(3),
|
||||||
InitialDelaySeconds: to.Int32Ptr(2),
|
InitialDelaySeconds: to.Int32Ptr(2),
|
||||||
TimeoutSeconds: to.Int32Ptr(1),
|
TimeoutSeconds: to.Int32Ptr(1),
|
||||||
},
|
},
|
||||||
|
@ -178,7 +178,7 @@ func TestHealthcheckTranslation(t *testing.T) {
|
||||||
assert.NilError(t, err)
|
assert.NilError(t, err)
|
||||||
assert.DeepEqual(t, (*group.Containers)[0].LivenessProbe.Exec.Command, to.StringSlicePtr(test))
|
assert.DeepEqual(t, (*group.Containers)[0].LivenessProbe.Exec.Command, to.StringSlicePtr(test))
|
||||||
assert.Equal(t, *(*group.Containers)[0].LivenessProbe.PeriodSeconds, int32(10))
|
assert.Equal(t, *(*group.Containers)[0].LivenessProbe.PeriodSeconds, int32(10))
|
||||||
assert.Equal(t, *(*group.Containers)[0].LivenessProbe.SuccessThreshold, int32(42))
|
assert.Assert(t, (*group.Containers)[0].LivenessProbe.SuccessThreshold == nil)
|
||||||
assert.Equal(t, *(*group.Containers)[0].LivenessProbe.FailureThreshold, int32(42))
|
assert.Equal(t, *(*group.Containers)[0].LivenessProbe.FailureThreshold, int32(42))
|
||||||
assert.Equal(t, *(*group.Containers)[0].LivenessProbe.InitialDelaySeconds, int32(2))
|
assert.Equal(t, *(*group.Containers)[0].LivenessProbe.InitialDelaySeconds, int32(2))
|
||||||
assert.Equal(t, *(*group.Containers)[0].LivenessProbe.TimeoutSeconds, int32(3))
|
assert.Equal(t, *(*group.Containers)[0].LivenessProbe.TimeoutSeconds, int32(3))
|
||||||
|
|
|
@ -62,7 +62,7 @@ func Command(contextType string) *cobra.Command {
|
||||||
cmd.Flags().BoolVar(&opts.Rm, "rm", false, "Automatically remove the container when it exits")
|
cmd.Flags().BoolVar(&opts.Rm, "rm", false, "Automatically remove the container when it exits")
|
||||||
cmd.Flags().StringVar(&opts.HealthCmd, "health-cmd", "", "Command to run to check health")
|
cmd.Flags().StringVar(&opts.HealthCmd, "health-cmd", "", "Command to run to check health")
|
||||||
cmd.Flags().DurationVar(&opts.HealthInterval, "health-interval", time.Duration(0), "Time between running the check (ms|s|m|h) (default 0s)")
|
cmd.Flags().DurationVar(&opts.HealthInterval, "health-interval", time.Duration(0), "Time between running the check (ms|s|m|h) (default 0s)")
|
||||||
cmd.Flags().IntVar(&opts.HealthRetries, "health-retries", 10, "Consecutive failures needed to report unhealthy")
|
cmd.Flags().IntVar(&opts.HealthRetries, "health-retries", 0, "Consecutive failures needed to report unhealthy")
|
||||||
cmd.Flags().DurationVar(&opts.HealthStartPeriod, "health-start-period", time.Duration(0), "Start period for the container to initialize before starting "+
|
cmd.Flags().DurationVar(&opts.HealthStartPeriod, "health-start-period", time.Duration(0), "Start period for the container to initialize before starting "+
|
||||||
"health-retries countdown (ms|s|m|h) (default 0s)")
|
"health-retries countdown (ms|s|m|h) (default 0s)")
|
||||||
cmd.Flags().DurationVar(&opts.HealthTimeout, "health-timeout", time.Duration(0), "Maximum time to allow one check to run (ms|s|m|h) (default 0s)")
|
cmd.Flags().DurationVar(&opts.HealthTimeout, "health-timeout", time.Duration(0), "Maximum time to allow one check to run (ms|s|m|h) (default 0s)")
|
||||||
|
|
|
@ -11,7 +11,7 @@ Flags:
|
||||||
--env-file stringArray Path to environment files to be translated as environment variables
|
--env-file stringArray Path to environment files to be translated as environment variables
|
||||||
--health-cmd string Command to run to check health
|
--health-cmd string Command to run to check health
|
||||||
--health-interval duration Time between running the check (ms|s|m|h) (default 0s)
|
--health-interval duration Time between running the check (ms|s|m|h) (default 0s)
|
||||||
--health-retries int Consecutive failures needed to report unhealthy (default 10)
|
--health-retries int Consecutive failures needed to report unhealthy
|
||||||
--health-start-period duration Start period for the container to initialize before starting health-retries countdown (ms|s|m|h) (default 0s)
|
--health-start-period duration Start period for the container to initialize before starting health-retries countdown (ms|s|m|h) (default 0s)
|
||||||
--health-timeout duration Maximum time to allow one check to run (ms|s|m|h) (default 0s)
|
--health-timeout duration Maximum time to allow one check to run (ms|s|m|h) (default 0s)
|
||||||
-l, --label stringArray Set meta data on a container
|
-l, --label stringArray Set meta data on a container
|
||||||
|
|
|
@ -86,13 +86,6 @@ func (r *Opts) ToContainerConfig(image string) (containers.ContainerConfig, erro
|
||||||
envVars = append(envVars, vars...)
|
envVars = append(envVars, vars...)
|
||||||
}
|
}
|
||||||
|
|
||||||
var healthCmd []string
|
|
||||||
var healthInterval types.Duration
|
|
||||||
if len(r.HealthCmd) > 0 {
|
|
||||||
healthCmd = strings.Split(r.HealthCmd, " ")
|
|
||||||
healthInterval = types.Duration(r.HealthInterval)
|
|
||||||
}
|
|
||||||
|
|
||||||
return containers.ContainerConfig{
|
return containers.ContainerConfig{
|
||||||
ID: r.Name,
|
ID: r.Name,
|
||||||
Image: image,
|
Image: image,
|
||||||
|
@ -106,12 +99,24 @@ func (r *Opts) ToContainerConfig(image string) (containers.ContainerConfig, erro
|
||||||
RestartPolicyCondition: restartPolicy,
|
RestartPolicyCondition: restartPolicy,
|
||||||
DomainName: r.DomainName,
|
DomainName: r.DomainName,
|
||||||
AutoRemove: r.Rm,
|
AutoRemove: r.Rm,
|
||||||
Healthcheck: containers.Healthcheck{
|
Healthcheck: r.toHealthcheck(),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Opts) toHealthcheck() containers.Healthcheck {
|
||||||
|
var healthCmd []string
|
||||||
|
|
||||||
|
if len(r.HealthCmd) > 0 {
|
||||||
|
healthCmd = strings.Split(r.HealthCmd, " ")
|
||||||
|
}
|
||||||
|
return containers.Healthcheck{
|
||||||
Disable: len(healthCmd) == 0,
|
Disable: len(healthCmd) == 0,
|
||||||
Test: healthCmd,
|
Test: healthCmd,
|
||||||
Interval: healthInterval,
|
Interval: types.Duration(r.HealthInterval),
|
||||||
},
|
StartPeriod: types.Duration(r.HealthStartPeriod),
|
||||||
}, nil
|
Timeout: types.Duration(r.HealthTimeout),
|
||||||
|
Retries: r.HealthRetries,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var restartPolicyMap = map[string]string{
|
var restartPolicyMap = map[string]string{
|
||||||
|
|
|
@ -20,7 +20,9 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"regexp"
|
"regexp"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/compose-spec/compose-go/types"
|
||||||
"github.com/google/go-cmp/cmp/cmpopts"
|
"github.com/google/go-cmp/cmp/cmpopts"
|
||||||
"gotest.tools/v3/assert"
|
"gotest.tools/v3/assert"
|
||||||
"gotest.tools/v3/assert/cmp"
|
"gotest.tools/v3/assert/cmp"
|
||||||
|
@ -227,3 +229,31 @@ func TestValidateRestartPolicy(t *testing.T) {
|
||||||
assert.Equal(t, testCase.expected, result)
|
assert.Equal(t, testCase.expected, result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestToHealthcheck(t *testing.T) {
|
||||||
|
testOpt := Opts{
|
||||||
|
HealthCmd: "curl",
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.DeepEqual(t, testOpt.toHealthcheck(), containers.Healthcheck{
|
||||||
|
Disable: false,
|
||||||
|
Test: []string{"curl"},
|
||||||
|
})
|
||||||
|
|
||||||
|
testOpt = Opts{
|
||||||
|
HealthCmd: "curl",
|
||||||
|
HealthRetries: 3,
|
||||||
|
HealthInterval: 5 * time.Second,
|
||||||
|
HealthTimeout: 2 * time.Second,
|
||||||
|
HealthStartPeriod: 10 * time.Second,
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.DeepEqual(t, testOpt.toHealthcheck(), containers.Healthcheck{
|
||||||
|
Disable: false,
|
||||||
|
Test: []string{"curl"},
|
||||||
|
Retries: 3,
|
||||||
|
Interval: types.Duration(5 * time.Second),
|
||||||
|
StartPeriod: types.Duration(10 * time.Second),
|
||||||
|
Timeout: types.Duration(2 * time.Second),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
@ -71,7 +71,7 @@ When running a container with `docker run`, by default the command line stays at
|
||||||
|
|
||||||
## Healthchecks
|
## Healthchecks
|
||||||
|
|
||||||
A health check can be described using the flags prefixed by `--healthcheck`. This is translated into `LivenessProbe` for ACI. If the health check fails then the container is considered unhealthy and terminated.
|
A health check can be described using the flags prefixed by `--health-`. This is translated into `LivenessProbe` for ACI. If the health check fails then the container is considered unhealthy and terminated.
|
||||||
In order for the container to be restarted automatically, the container needs to be run with a restart policy (set by the `--restart` flag) other than `no`. Note that the default restart policy if one isn't set is `no`.
|
In order for the container to be restarted automatically, the container needs to be run with a restart policy (set by the `--restart` flag) other than `no`. Note that the default restart policy if one isn't set is `no`.
|
||||||
|
|
||||||
In order to restart automatically, the container also need to have a restart policy set with `--restart` (`docker run` defaults to no restart policy)
|
In order to restart automatically, the container also need to have a restart policy set with `--restart` (`docker run` defaults to no restart policy)
|
||||||
|
|
Loading…
Reference in New Issue