diff --git a/api/types/container/hostconfig.go b/api/types/container/hostconfig.go index 9300095c6a..c49b64716a 100644 --- a/api/types/container/hostconfig.go +++ b/api/types/container/hostconfig.go @@ -320,7 +320,11 @@ func ValidateRestartPolicy(policy RestartPolicy) error { switch policy.Name { case RestartPolicyAlways, RestartPolicyUnlessStopped, RestartPolicyDisabled: if policy.MaximumRetryCount != 0 { - return &errInvalidParameter{fmt.Errorf("invalid restart policy: maximum retry count cannot be used with restart policy '%s'", policy.Name)} + msg := "invalid restart policy: maximum retry count can only be used with 'on-failure'" + if policy.MaximumRetryCount < 0 { + msg += " and cannot be negative" + } + return &errInvalidParameter{fmt.Errorf(msg)} } return nil case RestartPolicyOnFailure: @@ -334,7 +338,7 @@ func ValidateRestartPolicy(policy RestartPolicy) error { // backward-compatibility. return nil default: - return &errInvalidParameter{fmt.Errorf("invalid restart policy: '%s'", policy.Name)} + return &errInvalidParameter{fmt.Errorf("invalid restart policy: unknown policy '%s'; use one of '%s', '%s', '%s', or '%s'", policy.Name, RestartPolicyDisabled, RestartPolicyAlways, RestartPolicyOnFailure, RestartPolicyUnlessStopped)} } } diff --git a/api/types/container/hostconfig_test.go b/api/types/container/hostconfig_test.go index 8342e8f10d..8b5030c3e7 100644 --- a/api/types/container/hostconfig_test.go +++ b/api/types/container/hostconfig_test.go @@ -35,12 +35,12 @@ func TestValidateRestartPolicy(t *testing.T) { { name: "always with MaxRestartCount", input: RestartPolicy{Name: RestartPolicyAlways, MaximumRetryCount: 123}, - expectedErr: "invalid restart policy: maximum retry count cannot be used with restart policy 'always'", + expectedErr: "invalid restart policy: maximum retry count can only be used with 'on-failure'", }, { name: "always with negative MaxRestartCount", input: RestartPolicy{Name: RestartPolicyAlways, MaximumRetryCount: -123}, - expectedErr: "invalid restart policy: maximum retry count cannot be used with restart policy 'always'", + expectedErr: "invalid restart policy: maximum retry count can only be used with 'on-failure' and cannot be negative", }, { name: "unless-stopped", @@ -49,12 +49,12 @@ func TestValidateRestartPolicy(t *testing.T) { { name: "unless-stopped with MaxRestartCount", input: RestartPolicy{Name: RestartPolicyUnlessStopped, MaximumRetryCount: 123}, - expectedErr: "invalid restart policy: maximum retry count cannot be used with restart policy 'unless-stopped'", + expectedErr: "invalid restart policy: maximum retry count can only be used with 'on-failure'", }, { name: "unless-stopped with negative MaxRestartCount", input: RestartPolicy{Name: RestartPolicyUnlessStopped, MaximumRetryCount: -123}, - expectedErr: "invalid restart policy: maximum retry count cannot be used with restart policy 'unless-stopped'", + expectedErr: "invalid restart policy: maximum retry count can only be used with 'on-failure' and cannot be negative", }, { name: "disabled", @@ -63,12 +63,12 @@ func TestValidateRestartPolicy(t *testing.T) { { name: "disabled with MaxRestartCount", input: RestartPolicy{Name: RestartPolicyDisabled, MaximumRetryCount: 123}, - expectedErr: "invalid restart policy: maximum retry count cannot be used with restart policy 'no'", + expectedErr: "invalid restart policy: maximum retry count can only be used with 'on-failure'", }, { name: "disabled with negative MaxRestartCount", input: RestartPolicy{Name: RestartPolicyDisabled, MaximumRetryCount: -123}, - expectedErr: "invalid restart policy: maximum retry count cannot be used with restart policy 'no'", + expectedErr: "invalid restart policy: maximum retry count can only be used with 'on-failure' and cannot be negative", }, { name: "on-failure", @@ -85,8 +85,8 @@ func TestValidateRestartPolicy(t *testing.T) { }, { name: "unknown policy", - input: RestartPolicy{Name: "I do not exist"}, - expectedErr: "invalid restart policy: 'I do not exist'", + input: RestartPolicy{Name: "unknown"}, + expectedErr: "invalid restart policy: unknown policy 'unknown'; use one of 'no', 'always', 'on-failure', or 'unless-stopped'", }, } diff --git a/integration-cli/docker_api_containers_test.go b/integration-cli/docker_api_containers_test.go index 7158847c66..316bbbae85 100644 --- a/integration-cli/docker_api_containers_test.go +++ b/integration-cli/docker_api_containers_test.go @@ -758,7 +758,7 @@ func (s *DockerAPISuite) TestContainerAPIRestartPolicyRetryMismatch(c *testing.T b, err := request.ReadBody(body) assert.NilError(c, err) - assert.Assert(c, strings.Contains(string(b[:]), "maximum retry count cannot be used with restart policy")) + assert.Assert(c, strings.Contains(string(b[:]), "invalid restart policy: maximum retry count can only be used with 'on-failure'")) } func (s *DockerAPISuite) TestContainerAPIRestartPolicyNegativeRetryCount(c *testing.T) {