在 docker swarm 容器内时,如何确定容器的副本号?

While inside a docker swarm container, how do i determine which replica number a container is?

鉴于我有一个名为 Whale 的 docker 集群服务,副本数为 10

容器启动时

运行时程序如何确定它是哪个副本号?

IE:“我是鲸鱼复制品 3 of 10”

最简单的方法是通过环境变量告诉它并使用 docker service create 支持的模板参数。

撰写语法如下所示。

services:
  replicated-service:
    environment:
      REPLICA: {{.Task.Slot}}
  

如果需要作为不支持Go Templates扩展的commandentrypoint的一部分。您可以使用 shell 中的值。 (请注意,healthcheck.test 不需要此解决方法,因为它默认为 CMD-SHELL

services:
  replicated-service:
    image: alpine/socat
    entrypoint: [
      "/bin/sh", 
      "-c", 
      "exec socat tcp-listen:9092,fork TCP:b$$REPLICA.internal:9092"
    ]
    environment:
      - REPLICA={{.Task.Slot}}
    healthcheck:
      test: socat /dev/null TCP:b$$REPLICA.internal:9092
    deploy:
      replicas: 2

另请注意 $$ 以从 YAML 处理中转义 $