swarm 中的副本数量不是从工作节点开始的 (1/4)

Sha*_*tel 0 docker swarm docker-compose docker-swarm docker-swarm-mode

我在具有 1 个主节点和 3 个工作节点的 docker swarm 集群上启动了 Flask API 服务。我已经使用以下 docker compose 文件部署了任务,

version: '3'

services:
  xgboost-model-api:
image: xgboost-model-api
  ports:
    - "5000:5000"
deploy:
  mode: global
networks:
  - xgboost-net

networks:
   xgboost-net:
Run Code Online (Sandbox Code Playgroud)

我使用以下 docker swarm 命令部署了该任务,

docker stack deploy --compose-file docker-compose.yml xgboost-swarm
Run Code Online (Sandbox Code Playgroud)

但是,该任务仅在我的主节点上启动,而不在任何工作节点上启动。

$ docker service ls
ID            NAME                             MODE        REPLICAS  IMAGE
pgd8cktr4foz  viz                              replicated  1/1       
dockersamples/visualizer
twrpr4av4c7f  xgboost-swarm_xgboost-model-api  global      1/4       xgboost-model-api
xxrfn1w7eqw6  dockercloud-server-proxy         global      1/1       dockercloud/server-proxy 
Run Code Online (Sandbox Code Playgroud)

使用的 Dockerfile 在这里。任何关于为什么会发生这种行为的想法将不胜感激。

her*_*erm 5

正如该线程中所述(重复?):

如果您使用的是私有注册表,那么通过使用与工作节点共享登录名和凭据非常重要

docker stack 部署 --with-registry-auth

- - 更新

从您的撰写文件来看,您似乎没有使用私人注册表。一般来说,如果容器无法在工作人员上成功启动,它们最终将在管理器上启动。一些可能的原因是:

  1. 无法访问私有注册表(使用 --with-registry-auth 修复)
  2. 应用程序需要在主机上进行一些更改才能运行(例如elasticSearch需要vm.max_map_count = 262144)
  3. 由于 helthcheck 编写不当,HealthCheck 在其他节点上失败
  4. 网络设置问题导致无法提取映像

尝试删除堆栈并再次运行它。然后执行docker service ps --no-trunc {serviceName}此操作可能会向您显示应在另一个节点上运行该服务的任务以及失败的原因。

查看此 SO 线程以获取更多故障排除提示。