Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix order of processing of some xx-add/xx-rm service update flags #2668

Merged
merged 1 commit into from
Aug 6, 2020

Commits on Aug 4, 2020

  1. Fix order of processing of some xx-add/xx-rm service update flags

    Combining `-add` and `-rm` flags on `docker service update` should
    be usable to explicitly replace existing options. The current order
    of processing did not allow this, causing the `-rm` flag to remove
    properties that were specified in `-add`. This behavior was inconsistent
    with (for example) `--host-add` and `--host-rm`.
    
    This patch updates the behavior to first remove properties, then
    add new properties.
    
    Note that there's still some improvements to make, to make the removal
    more granulas (e.g. to make `--label-rm label=some-value` only remove
    the label if value matches `some-value`); these changes are left for
    a follow-up.
    
    Before this change:
    -----------------------------
    
    Create a service with two env-vars
    
    ```bash
    docker service create --env FOO=bar --env BAR=baz  --name=test nginx:alpine
    docker service inspect --format '{{json .Spec.TaskTemplate.ContainerSpec.Env }}' test | jq .
    [
      "FOO=bar",
      "BAR=baz"
    ]
    ```
    
    Update the service, with the intent to replace the value of `FOO` for a new value
    
    ```bash
    docker service update  --env-rm FOO --env-add FOO=updated-foo test
    docker service inspect --format '{{json .Spec.TaskTemplate.ContainerSpec.Env }}' test | jq .
    [
      "BAR=baz"
    ]
    ```
    
    Create a service with two labels
    
    ```bash
    docker service create --label FOO=bar --label BAR=baz  --name=test nginx:alpine
    docker service inspect --format '{{json .Spec.Labels }}' test | jq .
    {
      "BAR": "baz",
      "FOO": "bar"
    }
    ```
    
    Update the service, with the intent to replace the value of `FOO` for a new value
    
    ```bash
    docker service update  --label-rm FOO --label-add FOO=updated-foo test
    docker service inspect --format '{{json .Spec.Labels }}' test | jq .
    {
      "BAR": "baz"
    }
    ```
    
    Create a service with two container labels
    
    ```bash
    docker service create --container-label FOO=bar --container-label BAR=baz  --name=test nginx:alpine
    docker service inspect --format '{{json .Spec.TaskTemplate.ContainerSpec.Labels }}' test | jq .
    {
      "BAR": "baz",
      "FOO": "bar"
    }
    ```
    
    Update the service, with the intent to replace the value of `FOO` for a new value
    
    ```bash
    docker service update  --container-label-rm FOO --container-label-add FOO=updated-foo test
    docker service inspect --format '{{json .Spec.TaskTemplate.ContainerSpec.Labels }}' test | jq .
    {
      "BAR": "baz",
    }
    ```
    
    With this patch applied:
    --------------------------------
    
    Create a service with two env-vars
    
    ```bash
    docker service create --env FOO=bar --env BAR=baz  --name=test nginx:alpine
    docker service inspect --format '{{json .Spec.TaskTemplate.ContainerSpec.Env }}' test | jq .
    [
      "FOO=bar",
      "BAR=baz"
    ]
    ```
    
    Update the service, and replace the value of `FOO` for a new value
    
    ```bash
    docker service update  --env-rm FOO --env-add FOO=updated-foo test
    docker service inspect --format '{{json .Spec.TaskTemplate.ContainerSpec.Env }}' test | jq .
    [
      "BAR=baz",
      "FOO=updated-foo"
    ]
    ```
    
    Create a service with two labels
    
    ```bash
    docker service create --label FOO=bar --label BAR=baz  --name=test nginx:alpine
    docker service inspect --format '{{json .Spec.Labels }}' test | jq .
    {
      "BAR": "baz",
      "FOO": "bar"
    }
    ```
    
    Update the service, and replace the value of `FOO` for a new value
    
    ```bash
    docker service update  --label-rm FOO --label-add FOO=updated-foo test
    docker service inspect --format '{{json .Spec.Labels }}' test | jq .
    {
      "BAR": "baz",
      "FOO": "updated-foo"
    }
    ```
    
    Create a service with two container labels
    
    ```bash
    docker service create --container-label FOO=bar --container-label BAR=baz  --name=test nginx:alpine
    docker service inspect --format '{{json .Spec.TaskTemplate.ContainerSpec.Labels }}' test | jq .
    {
      "BAR": "baz",
      "FOO": "bar"
    }
    ```
    
    Update the service, and replace the value of `FOO` for a new value
    
    ```bash
    docker service update  --container-label-rm FOO --container-label-add FOO=updated-foo test
    docker service inspect --format '{{json .Spec.TaskTemplate.ContainerSpec.Labels }}' test | jq .
    {
      "BAR": "baz",
      "FOO": "updated-foo"
    }
    ```
    
    Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
    thaJeztah committed Aug 4, 2020
    Configuration menu
    Copy the full SHA
    2fc608c View commit details
    Browse the repository at this point in the history