mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
healthcheck: do not interpret exit code 2 as "starting"
Instead reserve exit code 2 to be future proof, document that it should
not be used. Implementation-wise, it is considered as unhealthy, but
users should not rely on this as it may change in the future.
Signed-off-by: Tibor Vass <tibor@docker.com>
(cherry picked from commit 91e9f38313
)
Signed-off-by: Tibor Vass <tibor@docker.com>
This commit is contained in:
parent
bf024205b7
commit
0df31ff193
3 changed files with 2 additions and 24 deletions
|
@ -41,7 +41,6 @@ const (
|
||||||
|
|
||||||
exitStatusHealthy = 0 // Container is healthy
|
exitStatusHealthy = 0 // Container is healthy
|
||||||
exitStatusUnhealthy = 1 // Container is unhealthy
|
exitStatusUnhealthy = 1 // Container is unhealthy
|
||||||
exitStatusStarting = 2 // Container needs more time to start
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// probe implementations know how to run a particular type of probe.
|
// probe implementations know how to run a particular type of probe.
|
||||||
|
@ -127,12 +126,10 @@ func handleProbeResult(d *Daemon, c *container.Container, result *types.Healthch
|
||||||
if result.ExitCode == exitStatusHealthy {
|
if result.ExitCode == exitStatusHealthy {
|
||||||
h.FailingStreak = 0
|
h.FailingStreak = 0
|
||||||
h.Status = types.Healthy
|
h.Status = types.Healthy
|
||||||
} else if result.ExitCode == exitStatusStarting && c.State.Health.Status == types.Starting {
|
|
||||||
// The container is not ready yet. Remain in the starting state.
|
|
||||||
} else {
|
} else {
|
||||||
// Failure (including invalid exit code)
|
// Failure (including invalid exit code)
|
||||||
h.FailingStreak++
|
h.FailingStreak++
|
||||||
if c.State.Health.FailingStreak >= retries {
|
if h.FailingStreak >= retries {
|
||||||
h.Status = types.Unhealthy
|
h.Status = types.Unhealthy
|
||||||
}
|
}
|
||||||
// Else we're starting or healthy. Stay in that state.
|
// Else we're starting or healthy. Stay in that state.
|
||||||
|
|
|
@ -94,22 +94,6 @@ func TestHealthStates(t *testing.T) {
|
||||||
handleResult(c.State.StartedAt.Add(3*time.Second), 1)
|
handleResult(c.State.StartedAt.Add(3*time.Second), 1)
|
||||||
expect("health_status: unhealthy")
|
expect("health_status: unhealthy")
|
||||||
|
|
||||||
// starting -> starting -> starting ->
|
|
||||||
// healthy -> starting (invalid transition)
|
|
||||||
|
|
||||||
reset(c)
|
|
||||||
|
|
||||||
handleResult(c.State.StartedAt.Add(20*time.Second), 2)
|
|
||||||
handleResult(c.State.StartedAt.Add(40*time.Second), 2)
|
|
||||||
if c.State.Health.Status != types.Starting {
|
|
||||||
t.Errorf("Expecting starting, but got %#v\n", c.State.Health.Status)
|
|
||||||
}
|
|
||||||
|
|
||||||
handleResult(c.State.StartedAt.Add(50*time.Second), 0)
|
|
||||||
expect("health_status: healthy")
|
|
||||||
handleResult(c.State.StartedAt.Add(60*time.Second), 2)
|
|
||||||
expect("health_status: unhealthy")
|
|
||||||
|
|
||||||
// Test retries
|
// Test retries
|
||||||
|
|
||||||
reset(c)
|
reset(c)
|
||||||
|
|
|
@ -1524,10 +1524,7 @@ The possible values are:
|
||||||
|
|
||||||
- 0: success - the container is healthy and ready for use
|
- 0: success - the container is healthy and ready for use
|
||||||
- 1: unhealthy - the container is not working correctly
|
- 1: unhealthy - the container is not working correctly
|
||||||
- 2: starting - the container is not ready for use yet, but is working correctly
|
- 2: reserved - do not use this exit code
|
||||||
|
|
||||||
If the probe returns 2 ("starting") when the container has already moved out of the
|
|
||||||
"starting" state then it is treated as "unhealthy" instead.
|
|
||||||
|
|
||||||
For example, to check every five minutes or so that a web-server is able to
|
For example, to check every five minutes or so that a web-server is able to
|
||||||
serve the site's main page within three seconds:
|
serve the site's main page within three seconds:
|
||||||
|
|
Loading…
Reference in a new issue