Add force option to service update
| ... | ... |
@@ -61,6 +61,10 @@ type TaskSpec struct {
|
| 61 | 61 |
// spec. If not present, the one on cluster default on swarm.Spec will be |
| 62 | 62 |
// used, finally falling back to the engine default if not specified. |
| 63 | 63 |
LogDriver *Driver `json:",omitempty"` |
| 64 |
+ |
|
| 65 |
+ // ForceUpdate is a counter that triggers an update even if no relevant |
|
| 66 |
+ // parameters have been changed. |
|
| 67 |
+ ForceUpdate uint64 |
|
| 64 | 68 |
} |
| 65 | 69 |
|
| 66 | 70 |
// Resources represents resources (CPU/Memory). |
| ... | ... |
@@ -37,6 +37,7 @@ func newUpdateCommand(dockerCli *command.DockerCli) *cobra.Command {
|
| 37 | 37 |
flags.String("image", "", "Service image tag")
|
| 38 | 38 |
flags.String("args", "", "Service command args")
|
| 39 | 39 |
flags.Bool("rollback", false, "Rollback to previous specification")
|
| 40 |
+ flags.Bool("force", false, "Force update even if no changes require it")
|
|
| 40 | 41 |
addServiceFlags(cmd, opts) |
| 41 | 42 |
|
| 42 | 43 |
flags.Var(newListOptsVar(), flagEnvRemove, "Remove an environment variable") |
| ... | ... |
@@ -257,6 +258,15 @@ func updateService(flags *pflag.FlagSet, spec *swarm.ServiceSpec) error {
|
| 257 | 257 |
return err |
| 258 | 258 |
} |
| 259 | 259 |
|
| 260 |
+ force, err := flags.GetBool("force")
|
|
| 261 |
+ if err != nil {
|
|
| 262 |
+ return err |
|
| 263 |
+ } |
|
| 264 |
+ |
|
| 265 |
+ if force {
|
|
| 266 |
+ spec.TaskTemplate.ForceUpdate++ |
|
| 267 |
+ } |
|
| 268 |
+ |
|
| 260 | 269 |
return nil |
| 261 | 270 |
} |
| 262 | 271 |
|
| ... | ... |
@@ -1185,6 +1185,7 @@ __docker_service_subcommand() {
|
| 1185 | 1185 |
"($help)--arg=[Service command args]:arguments: _normal" \ |
| 1186 | 1186 |
"($help)*--container-label-add=[Add or update container labels]:label: " \ |
| 1187 | 1187 |
"($help)*--container-label-rm=[Remove a container label by its key]:label: " \ |
| 1188 |
+ "($help)--force[Force update]" \ |
|
| 1188 | 1189 |
"($help)*--group-rm=[Remove previously added user groups from the container]:group:_groups" \ |
| 1189 | 1190 |
"($help)--image=[Service image tag]:image:__docker_repositories" \ |
| 1190 | 1191 |
"($help)--rollback[Rollback to previous specification]" \ |
| ... | ... |
@@ -74,6 +74,7 @@ func serviceSpecFromGRPC(spec *swarmapi.ServiceSpec) *types.ServiceSpec {
|
| 74 | 74 |
Placement: placementFromGRPC(spec.Task.Placement), |
| 75 | 75 |
LogDriver: driverFromGRPC(spec.Task.LogDriver), |
| 76 | 76 |
Networks: taskNetworks, |
| 77 |
+ ForceUpdate: spec.Task.ForceUpdate, |
|
| 77 | 78 |
}, |
| 78 | 79 |
|
| 79 | 80 |
Networks: serviceNetworks, |
| ... | ... |
@@ -136,9 +137,10 @@ func ServiceSpecToGRPC(s types.ServiceSpec) (swarmapi.ServiceSpec, error) {
|
| 136 | 136 |
Labels: s.Labels, |
| 137 | 137 |
}, |
| 138 | 138 |
Task: swarmapi.TaskSpec{
|
| 139 |
- Resources: resourcesToGRPC(s.TaskTemplate.Resources), |
|
| 140 |
- LogDriver: driverToGRPC(s.TaskTemplate.LogDriver), |
|
| 141 |
- Networks: taskNetworks, |
|
| 139 |
+ Resources: resourcesToGRPC(s.TaskTemplate.Resources), |
|
| 140 |
+ LogDriver: driverToGRPC(s.TaskTemplate.LogDriver), |
|
| 141 |
+ Networks: taskNetworks, |
|
| 142 |
+ ForceUpdate: s.TaskTemplate.ForceUpdate, |
|
| 142 | 143 |
}, |
| 143 | 144 |
Networks: serviceNetworks, |
| 144 | 145 |
} |
| ... | ... |
@@ -149,6 +149,7 @@ This section lists each version from latest to oldest. Each listing includes a |
| 149 | 149 |
containers that are tasks (part of a service in swarm mode). |
| 150 | 150 |
* `POST /containers/create` now takes `StopTimeout` field. |
| 151 | 151 |
* `POST /services/create` and `POST /services/(id or name)/update` now accept `Monitor` and `MaxFailureRatio` parameters, which control the response to failures during service updates. |
| 152 |
+* `POST /services/(id or name)/update` now accepts a `ForceUpdate` parameter inside the `TaskTemplate`, which causes the service to be updated even if there are no changes which would ordinarily trigger an update. |
|
| 152 | 153 |
* `GET /networks/(name)` now returns field `Created` in response to show network created time. |
| 153 | 154 |
* `POST /containers/(id or name)/exec` now accepts an `Env` field, which holds a list of environment variables to be set in the context of the command execution. |
| 154 | 155 |
* `GET /volumes`, `GET /volumes/(name)`, and `POST /volumes/create` now return the `Options` field which holds the driver specific options to use for when creating the volume. |
| ... | ... |
@@ -4915,7 +4915,8 @@ List services |
| 4915 | 4915 |
"Condition": "any", |
| 4916 | 4916 |
"MaxAttempts": 0 |
| 4917 | 4917 |
}, |
| 4918 |
- "Placement": {}
|
|
| 4918 |
+ "Placement": {},
|
|
| 4919 |
+ "ForceUpdate": 0 |
|
| 4919 | 4920 |
}, |
| 4920 | 4921 |
"Mode": {
|
| 4921 | 4922 |
"Replicated": {
|
| ... | ... |
@@ -5038,7 +5039,8 @@ image](#create-an-image) section for more details. |
| 5038 | 5038 |
"Condition": "on-failure", |
| 5039 | 5039 |
"Delay": 10000000000.0, |
| 5040 | 5040 |
"MaxAttempts": 10 |
| 5041 |
- } |
|
| 5041 |
+ }, |
|
| 5042 |
+ "ForceUpdate": 0 |
|
| 5042 | 5043 |
}, |
| 5043 | 5044 |
"Mode": {
|
| 5044 | 5045 |
"Replicated": {
|
| ... | ... |
@@ -5132,6 +5134,7 @@ image](#create-an-image) section for more details. |
| 5132 | 5132 |
- **Window** – Windows is the time window used to evaluate the restart policy (default value is |
| 5133 | 5133 |
0, which is unbounded). |
| 5134 | 5134 |
- **Placement** – An array of constraints. |
| 5135 |
+ - **ForceUpdate**: A counter that triggers an update even if no relevant parameters have been changed. |
|
| 5135 | 5136 |
- **Mode** – Scheduling mode for the service (`replicated` or `global`, defaults to `replicated`). |
| 5136 | 5137 |
- **UpdateConfig** – Specification for the update strategy of the service. |
| 5137 | 5138 |
- **Parallelism** – Maximum number of tasks to be updated in one iteration (0 means unlimited |
| ... | ... |
@@ -5303,7 +5306,8 @@ image](#create-an-image) section for more details. |
| 5303 | 5303 |
"Condition": "any", |
| 5304 | 5304 |
"MaxAttempts": 0 |
| 5305 | 5305 |
}, |
| 5306 |
- "Placement": {}
|
|
| 5306 |
+ "Placement": {},
|
|
| 5307 |
+ "ForceUpdate": 0 |
|
| 5307 | 5308 |
}, |
| 5308 | 5309 |
"Mode": {
|
| 5309 | 5310 |
"Replicated": {
|
| ... | ... |
@@ -5374,6 +5378,7 @@ image](#create-an-image) section for more details. |
| 5374 | 5374 |
- **Window** – Windows is the time window used to evaluate the restart policy (default value is |
| 5375 | 5375 |
0, which is unbounded). |
| 5376 | 5376 |
- **Placement** – An array of constraints. |
| 5377 |
+ - **ForceUpdate**: A counter that triggers an update even if no relevant parameters have been changed. |
|
| 5377 | 5378 |
- **Mode** – Scheduling mode for the service (`replicated` or `global`, defaults to `replicated`). |
| 5378 | 5379 |
- **UpdateConfig** – Specification for the update strategy of the service. |
| 5379 | 5380 |
- **Parallelism** – Maximum number of tasks to be updated in one iteration (0 means unlimited |
| ... | ... |
@@ -29,6 +29,7 @@ Options: |
| 29 | 29 |
--endpoint-mode string Endpoint mode (vip or dnsrr) |
| 30 | 30 |
--env-add value Add or update environment variables (default []) |
| 31 | 31 |
--env-rm value Remove an environment variable (default []) |
| 32 |
+ --force Force update even if no changes require it |
|
| 32 | 33 |
--group-add value Add additional user groups to the container (default []) |
| 33 | 34 |
--group-rm value Remove previously added user groups from the container (default []) |
| 34 | 35 |
--help Print usage |
| ... | ... |
@@ -67,6 +68,12 @@ Updates a service as described by the specified parameters. This command has to |
| 67 | 67 |
The parameters are the same as [`docker service create`](service_create.md). Please look at the description there |
| 68 | 68 |
for further information. |
| 69 | 69 |
|
| 70 |
+Normally, updating a service will only cause the service's tasks to be replaced with new ones if a change to the |
|
| 71 |
+service requires recreating the tasks for it to take effect. For example, only changing the |
|
| 72 |
+`--update-parallelism` setting will not recreate the tasks, because the individual tasks are not affected by this |
|
| 73 |
+setting. However, the `--force` flag will cause the tasks to be recreated anyway. This can be used to perform a |
|
| 74 |
+rolling restart without any changes to the service parameters. |
|
| 75 |
+ |
|
| 70 | 76 |
## Examples |
| 71 | 77 |
|
| 72 | 78 |
### Update a service |
| ... | ... |
@@ -75,6 +82,19 @@ for further information. |
| 75 | 75 |
$ docker service update --limit-cpu 2 redis |
| 76 | 76 |
``` |
| 77 | 77 |
|
| 78 |
+### Perform a rolling restart with no parameter changes |
|
| 79 |
+ |
|
| 80 |
+```bash |
|
| 81 |
+$ docker service update --force --update-parallelism 1 --update-delay 30s redis |
|
| 82 |
+``` |
|
| 83 |
+ |
|
| 84 |
+In this example, the `--force` flag causes the service's tasks to be shut down |
|
| 85 |
+and replaced with new ones even though none of the other parameters would |
|
| 86 |
+normally cause that to happen. The `--update-parallelism 1` setting ensures |
|
| 87 |
+that only one task is replaced at a time (this is the default behavior). The |
|
| 88 |
+`--update-delay 30s` setting introduces a 30 second delay between tasks, so |
|
| 89 |
+that the rolling restart happens gradually. |
|
| 90 |
+ |
|
| 78 | 91 |
### Adding and removing mounts |
| 79 | 92 |
|
| 80 | 93 |
Use the `--mount-add` or `--mount-rm` options add or remove a service's bind-mounts |