Docker Swarm,一个在分布式环境中部署多个标签时无法解决的问题

Docker Swarm,一个在分布式环境中部署多个标签时无法解决的问题,docker,docker-compose,docker-swarm,Docker,Docker Compose,Docker Swarm,设置两台服务器,一台作为管理器节点,另一台作为工作节点 工作节点标记为role_1=true 管理器节点标记为role_2、role_3 $ docker node update --label-add role_1=true node_1 node_1 $ docker node update --label-add role_2=true node_2 node_2 $ docker node update --label-add role_3=true node_2 node_2 $

设置两台服务器,一台作为管理器节点,另一台作为工作节点

工作节点标记为role_1=true

管理器节点标记为role_2、role_3

$ docker node update --label-add role_1=true node_1
node_1

$ docker node update --label-add role_2=true node_2
node_2

$ docker node update --label-add role_3=true node_2
node_2

$ docker node inspect node_1 --pretty
ID:                     rdnmlf1m0ge
Labels:
 - role_1=true

$ docker node inspect node_2 --pretty
ID:                     td1cq8oxxrk2a
Labels:
 - role_2=true
 - role_3=true

main.go文件Dockerfile是:

梅因,加油

package main

import (
        "net/http"
)

func main() {
        http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
                w.Write([]byte("Hello World!"))
        })

        err := http.ListenAndServe(":8080", nil)
        if err != nil {
                return
        }
}

dockerfile

FROM golang:latest

ENV GO111MODULE=off

WORKDIR /go/src/app
COPY . /go/src/app

RUN go build -o simple_program

ENTRYPOINT ["/go/src/app/simple_program"]

编写docker compose文件,如下所示。 仅将管理器节点的标签添加到约束

version: '3.7'

services:
  api_server:
    image: simple_program
    deploy:
      mode: global
      placement:
        constraints:
          - node.labels.role_2 == true
          - node.labels.role_3 == true
    ports:
      - 8080:8080

它按预期工作

$ docker stack deploy --compose-file docker-compose.yml simple_http_server
Creating network simple_http_server_default
Creating service simple_http_server_api_server

$ docker service ls
ID                 NAME                                MODE      REPLICAS   IMAGE                      PORTS
2vksfee0e4ef   simple_http_server_api_server   global        1/1         simple_program:latest   *:8080->8080/tcp

如果它同时分发给管理器节点和工作节点,或者只分发给工作节点,则服务不会启动

version: '3.7'

services:
  api_server:
    image: simple_program
    deploy:
      mode: global
      placement:
        constraints:
          - node.labels.role_1 == true
          - node.labels.role_3 == true
    ports:
      - 8080:8080

服务日志中也没有显示任何内容

$ docker service ps --no-trunc simple_http_server_api_server
ID        NAME      IMAGE     NODE      DESIRED STATE   CURRENT STATE   ERROR     PORTS

$ docker service logs simple_http_server_api_server
$

我阅读了下面的问题和答案,但没有帮助

来自: 如果指定多个放置约束,则服务仅部署到满足这些约束的节点上


您的第二次部署列出了节点1和节点3的约束组合,这是不可能的,因为您没有满足这一要求的节点。

我没有正确检查文档。非常感谢。
$ docker service ps --no-trunc simple_http_server_api_server
ID        NAME      IMAGE     NODE      DESIRED STATE   CURRENT STATE   ERROR     PORTS

$ docker service logs simple_http_server_api_server
$