Merge pull request #7227 from kawmy/7226-preserve-mount-order
cli/command/service: preserve mount order on force update
diff --git a/cli/command/service/update.go b/cli/command/service/update.go
index 7520b08..28869c9 100644
--- a/cli/command/service/update.go
+++ b/cli/command/service/update.go
@@ -352,8 +352,10 @@
if err := updateIsolation(flagIsolation, &cspec.Isolation); err != nil {
return err
}
- if err := updateMounts(flags, &cspec.Mounts); err != nil {
- return err
+ if anyChanged(flags, flagMountAdd, flagMountRemove) {
+ if err := updateMounts(flags, &cspec.Mounts); err != nil {
+ return err
+ }
}
updateSysCtls(flags, &task.ContainerSpec.Sysctls)
diff --git a/cli/command/service/update_test.go b/cli/command/service/update_test.go
index 6158820..38dd29c 100644
--- a/cli/command/service/update_test.go
+++ b/cli/command/service/update_test.go
@@ -250,6 +250,32 @@
assert.Check(t, is.Equal("/tokeep", mounts[1].Target))
}
+func TestUpdateServiceForcePreservesMountOrder(t *testing.T) {
+ flags := newUpdateCommand(nil).Flags()
+ assert.NilError(t, flags.Set("force", "true"))
+
+ spec := &swarm.ServiceSpec{
+ TaskTemplate: swarm.TaskSpec{
+ ContainerSpec: &swarm.ContainerSpec{
+ Mounts: []mount.Mount{
+ {Type: mount.TypeVolume, Source: "z-volume", Target: "/data/z"},
+ {Type: mount.TypeVolume, Source: "a-volume", Target: "/data/a"},
+ {Type: mount.TypeVolume, Source: "m-volume", Target: "/data/m"},
+ },
+ },
+ },
+ }
+
+ err := updateService(context.Background(), nil, flags, spec)
+ assert.NilError(t, err)
+ assert.Equal(t, spec.TaskTemplate.ForceUpdate, uint64(1))
+ assert.DeepEqual(t, spec.TaskTemplate.ContainerSpec.Mounts, []mount.Mount{
+ {Type: mount.TypeVolume, Source: "z-volume", Target: "/data/z"},
+ {Type: mount.TypeVolume, Source: "a-volume", Target: "/data/a"},
+ {Type: mount.TypeVolume, Source: "m-volume", Target: "/data/m"},
+ })
+}
+
func TestUpdateMountsWithDuplicateMounts(t *testing.T) {
flags := newUpdateCommand(nil).Flags()
flags.Set("mount-add", "type=volume,source=vol4,target=/toadd")