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 {
|
||||
probe.FailureThreshold = retries
|
||||
probe.SuccessThreshold = retries
|
||||
}
|
||||
return &probe
|
||||
}
|
||||
|
@ -365,8 +364,8 @@ func ContainerGroupToContainer(containerID string, cg containerinstance.Containe
|
|||
if cc.LivenessProbe.PeriodSeconds != nil {
|
||||
healthcheck.Interval = types.Duration(int64(*cc.LivenessProbe.PeriodSeconds) * int64(time.Second))
|
||||
}
|
||||
if cc.LivenessProbe.SuccessThreshold != nil {
|
||||
healthcheck.Retries = int(*cc.LivenessProbe.SuccessThreshold)
|
||||
if cc.LivenessProbe.FailureThreshold != nil {
|
||||
healthcheck.Retries = int(*cc.LivenessProbe.FailureThreshold)
|
||||
}
|
||||
if cc.LivenessProbe.TimeoutSeconds != nil {
|
||||
healthcheck.Timeout = types.Duration(int64(*cc.LivenessProbe.TimeoutSeconds) * int64(time.Second))
|
||||
|
|
|
@ -98,7 +98,7 @@ func TestContainerGroupToContainer(t *testing.T) {
|
|||
}),
|
||||
},
|
||||
PeriodSeconds: to.Int32Ptr(10),
|
||||
SuccessThreshold: to.Int32Ptr(3),
|
||||
FailureThreshold: to.Int32Ptr(3),
|
||||
InitialDelaySeconds: to.Int32Ptr(2),
|
||||
TimeoutSeconds: to.Int32Ptr(1),
|
||||
},
|
||||
|
@ -178,7 +178,7 @@ func TestHealthcheckTranslation(t *testing.T) {
|
|||
assert.NilError(t, err)
|
||||
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.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.InitialDelaySeconds, int32(2))
|
||||
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().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().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 "+
|
||||
"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)")
|
||||
|
|
|
@ -11,7 +11,7 @@ Flags:
|
|||
--env-file stringArray Path to environment files to be translated as environment variables
|
||||
--health-cmd string Command to run to check health
|
||||
--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-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
|
||||
|
|
|
@ -86,13 +86,6 @@ func (r *Opts) ToContainerConfig(image string) (containers.ContainerConfig, erro
|
|||
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{
|
||||
ID: r.Name,
|
||||
Image: image,
|
||||
|
@ -106,14 +99,26 @@ func (r *Opts) ToContainerConfig(image string) (containers.ContainerConfig, erro
|
|||
RestartPolicyCondition: restartPolicy,
|
||||
DomainName: r.DomainName,
|
||||
AutoRemove: r.Rm,
|
||||
Healthcheck: containers.Healthcheck{
|
||||
Disable: len(healthCmd) == 0,
|
||||
Test: healthCmd,
|
||||
Interval: healthInterval,
|
||||
},
|
||||
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,
|
||||
Test: healthCmd,
|
||||
Interval: types.Duration(r.HealthInterval),
|
||||
StartPeriod: types.Duration(r.HealthStartPeriod),
|
||||
Timeout: types.Duration(r.HealthTimeout),
|
||||
Retries: r.HealthRetries,
|
||||
}
|
||||
}
|
||||
|
||||
var restartPolicyMap = map[string]string{
|
||||
"": containers.RestartPolicyNone,
|
||||
containers.RestartPolicyNone: containers.RestartPolicyNone,
|
||||
|
|
|
@ -20,7 +20,9 @@ import (
|
|||
"errors"
|
||||
"regexp"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/compose-spec/compose-go/types"
|
||||
"github.com/google/go-cmp/cmp/cmpopts"
|
||||
"gotest.tools/v3/assert"
|
||||
"gotest.tools/v3/assert/cmp"
|
||||
|
@ -227,3 +229,31 @@ func TestValidateRestartPolicy(t *testing.T) {
|
|||
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
|
||||
|
||||
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 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