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

Jac*_*phy 4 docker swarm docker-swarm docker-container

假设我有一个名为 Whale 的 docker swarm 服务,其副本数为 10

当容器启动时

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

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

Chr*_*cke 7

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

撰写语法如下所示。

services:
  replicated-service:
    environment:
      REPLICA: "{{.Task.Slot}}"
Run Code Online (Sandbox Code Playgroud)

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

services:
  replicated-service:
    image: alpine/socat
    hostname: whale{{.Task.Slot}}
    entrypoint: [
      "/bin/sh", 
      "-c", 
      "exec socat tcp-listen:9092,fork TCP:whale$$REPLICA:9092"
    ]
    environment:
      REPLICA: "{{.Task.Slot}}"
    healthcheck:
      test: socat /dev/null TCP:whale$$REPLICA:9092
    deploy:
      replicas: 2
Run Code Online (Sandbox Code Playgroud)

另请注意,$$要逃避$YAML 处理。