diff --git a/cli/command/container/opts_test.go b/cli/command/container/opts_test.go index 460c74fad0..d8bb7043d4 100644 --- a/cli/command/container/opts_test.go +++ b/cli/command/container/opts_test.go @@ -714,6 +714,10 @@ func TestParseRestartPolicy(t *testing.T) { Name: "no", }, }, + { + input: ":1", + expectedErr: "invalid restart policy format: no policy provided before colon", + }, { input: "always", expected: container.RestartPolicy{ @@ -758,11 +762,11 @@ func TestParseRestartPolicy(t *testing.T) { t.Run(tc.input, func(t *testing.T) { _, hostConfig, _, err := parseRun([]string{"--restart=" + tc.input, "img", "cmd"}) if tc.expectedErr != "" { - assert.Check(t, is.Nil(hostConfig)) assert.Check(t, is.Error(err, tc.expectedErr)) + assert.Check(t, is.Nil(hostConfig)) } else { + assert.NilError(t, err) assert.Check(t, is.DeepEqual(hostConfig.RestartPolicy, tc.expected)) - assert.Check(t, err) } }) } diff --git a/opts/parse.go b/opts/parse.go index 017577e4bf..8b8012d300 100644 --- a/opts/parse.go +++ b/opts/parse.go @@ -71,17 +71,22 @@ func ConvertKVStringsToMapWithNil(values []string) map[string]*string { // ParseRestartPolicy returns the parsed policy or an error indicating what is incorrect func ParseRestartPolicy(policy string) (container.RestartPolicy, error) { - p := container.RestartPolicy{} - if policy == "" { - return p, nil + // for backward-compatibility, we don't set the default ("no") + // policy here, because older versions of the engine may not + // support it. + return container.RestartPolicy{}, nil } - k, v, _ := strings.Cut(policy, ":") + p := container.RestartPolicy{} + k, v, ok := strings.Cut(policy, ":") + if ok && k == "" { + return container.RestartPolicy{}, fmt.Errorf("invalid restart policy format: no policy provided before colon") + } if v != "" { count, err := strconv.Atoi(v) if err != nil { - return p, fmt.Errorf("invalid restart policy format: maximum retry count must be an integer") + return container.RestartPolicy{}, fmt.Errorf("invalid restart policy format: maximum retry count must be an integer") } p.MaximumRetryCount = count }