0

I have the following in my compose file:

  postgres:
    deploy:
      mode: global
      placement:
        constraints:
          - node.labels.server == data

And my node has the following when I inspect it:

"Spec": {
    "Labels": {
        "server": "data"
    },
    "Role": "worker",
    "Availability": "active"
},

However, when i deploy my stack postgres doesn't install anywhere...

What am I missing?

[UPDATE]

This is in the docker-compose.prod.yml btw in case you're wondering where the rest of the config is

[UPDATE]

This is running my compose as a stack across multiple servers. Using this command to fire it off:

docker stack deploy --compose-file docker-compose.yml --compose-file docker-compose.prod.yml stackname--with-registry-auth

Here is the output of ps:

root@sonatribe-1:~# docker service ps postgres --no-trunc
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE       ERROR               PORTS

Elsewhere on other services I have stuff like this to ensure certain stuff is run on a manager node:

deploy:
  mode: global
  placement:
    constraints:
      - node.role == manager

And that works fine - it's only the one using:

node.labels.server == data

That doesn't work

  • Are you running a stack in swarm mode or are you just running using docker-compose? Can you please provide the output of `docker service ps your_service_name --no-trunc`? – Mepla Sep 15 '18 at 15:40
  • @Mepla have responded above –  Sep 15 '18 at 15:48
  • Docker swarm by default prepends a `stackname_` to service names, so the ps command should be `docker service ps stackname_postgres --no-trunc`. You may have a different postgres container running on your host. Let me know if changing the ps command changes the output. (I used `stackname` because you used it in your deploy command, replace it with your actual stack name of course) – Mepla Sep 15 '18 at 16:02
  • Hi - I removed the stack name to make it less verbose - I copied the name from docker service ls –  Sep 15 '18 at 16:06

1 Answers1

2

This works for me, so I'll step through it to see if there's something missing on your end:

I created a three node swarm, with one manager:

docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
diewo1v4bf2149fx422guh8ci *   dvc1                Ready               Active              Leader              18.06.1-ce
jlz2sbman8wz7sukcs41jng1n     dvc2                Ready               Active                                  18.06.1-ce
g7kocy0qo76m42o80phr6poh4     dvc3                Ready               Active                                  18.06.1-ce

I add a label to node 3:

docker node update dvc3 --label-add server=data

docker node inspect dvc3:

"Spec": {
            "Labels": {
                "server": "data"
            },
            "Role": "worker",
            "Availability": "active"
        },

I have a compose file stack.yml:

version: '3.7'

services:
  nginx:
    image: nginx:alpine
    deploy:
      mode: global
      placement:
        constraints:
          - node.labels.server == data

I deploy the stack:

docker stack deploy -c stack.yml test

I was also running docker events on dvc1 which showed:

2018-09-15T23:50:49.608191542-04:00 network create yf21vjsbjpcnastxugnp3dax5 (name=test_default)
2018-09-15T23:50:49.609334207-04:00 network update yf21vjsbjpcnastxugnp3dax5 (name=test_default)
2018-09-15T23:50:49.609992316-04:00 node update diewo1v4bf2149fx422guh8ci (name=dvc1)
2018-09-15T23:50:49.610052739-04:00 node update g7kocy0qo76m42o80phr6poh4 (name=dvc3)
2018-09-15T23:50:49.610086383-04:00 node update jlz2sbman8wz7sukcs41jng1n (name=dvc2)
2018-09-15T23:50:50.067716009-04:00 service create xjgwq14ot13r1olzcsatd2ktb (name=test_nginx)
2018-09-15T23:50:50.119799354-04:00 service update xjgwq14ot13r1olzcsatd2ktb (name=test_nginx)

I should have also run events on dvc3 so I caught the task creation (which will only show on the node that gets it).

Let's check the stack and task:

docker service ls

ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
xjgwq14ot13r        test_nginx          global              1/1                 nginx:alpine

docker node ps dvc3
ID                  NAME                                   IMAGE               NODE                DESIRED STATE       CURRENT STATE                ERROR               PORTS
w1i3fpwfy88c        test_nginx.g7kocy0qo76m42o80phr6poh4   nginx:alpine        dvc3                Running             Running about a minute ago

I hope that helps, can you dumb your solution down to that example and see if it works?

Bret Fisher
  • 8,164
  • 2
  • 31
  • 36
  • All working - not sure what it was but I think a break from the keyboard and stepping through the above helped :) –  Sep 16 '18 at 14:30