【问题标题】:Reliable way of getting the full container name inside a container running in Docker Swarm在 Docker Swarm 中运行的容器中获取完整容器名称的可靠方法
【发布时间】:2021-06-10 15:53:06
【问题描述】:

背景:我有一个设置,其中许多不同的可扩展服务通过连接池(每个实例)连接到它们的数据库。这些服务在 Docker Swarm 中运行。

在我当前的数据库设置中,结果如下(在本例中使用 PostgreSQL):

PID | Database | User | Application                     | Client | ...
... | db1      | app  | --standard JDBC driver string-- | x      | ...
... | db1      | app  | --standard JDBC driver string-- | y      | ... 
... | db1      | app  | --standard JDBC driver string-- | y      | ... 
... | ...      | app  | ...                             | x      | ... 
... | ...      | app  | ...                             | x      | ... 
... | db2      | app  | --standard JDBC driver string-- | y      | ... 
... | db2      | app  | --standard JDBC driver string-- | y      | ... 
... | ...      | app  | ...                             | x      | ... 
... | ...      | app  | ...                             | x      | ... 

我想要做的实际上是向 DBMS 提供 当前 Docker Swarm 容器名称,包括缩放标识符,以便能够更好地监控数据库连接,即:

PID | Database | User | Application        | Client | ...
... | db1      | app  | books-service.1    | x      | ...
... | db1      | app  | books-service.2    | y      | ... 
... | db1      | app  | books-service.3    | y      | ... 
... | ...      | app  | ...                | x      | ... 
... | ...      | app  | ...                | x      | ... 
... | db2      | app  | checkout-service.2 | y      | ... 
... | db2      | app  | checkout-service.2 | y      | ... 
... | ...      | app  | ...                | x      | ... 
... | ...      | app  | ...                | x      | ... 

(显然,设置连接字符串是微不足道的 - 它正在获取要设置的信息)

由于我的应用程序由 Docker Swarm 管理(将来某个时候,可能是 Kubernetes),我无法通过环境手动设置此值(因为我不执行 docker run)。

在给定的 Swarm 节点上运行 docker ps 时,我看到以下输出:

CONTAINER ID        IMAGE                                               COMMAND                  CREATED             STATUS              PORTS                                 NAMES
59cdbf724091        my-docker-registry.net/books-service:latest         "/bin/sh -c '/usr/bi…"   7 minutes ago       Up 7 minutes                                              books-service.1.zabvo1jal0h2xya9qfftnrnej
0eeeee15e92a        my-docker-registry.net/checkout-service:latest      "/bin/sh -c 'exec /u…"   8 minutes ago       Up 8 minutes                                              checkout-service.2.189s7d09m0q86y7fdf3wpy0vc

值得注意的是NAMES 列,其中包含给定容器(或图像,但您更愿意查看它)的实际实例 的标识符。请注意,此名称​​不是容器的主机名,默认情况下是容器 ID。

我知道有一些方法可以确定应用程序是否在 Docker 中运行(例如 using /proc/1/cgroup),但这对我也没有帮助,因为这些方法也只列出了容器 ID。

有没有办法从集群中运行的 Docker 容器中获取这个值?

【问题讨论】:

  • 如果我弄错了,请纠正我,您想从容器内获取books-service.1.zabvo1jal0h2xya9qfftnrnej,对吗?还是只是名称的一部分?
  • 是的,没错。更具体地说,我想获得该值,以便我可以提取 books-service.1 部分。如果有办法直接获得books-service.1,那也很好。如果有办法自己获取1那个也可以。

标签: docker docker-swarm


【解决方案1】:

您需要 (books-service.1) 是 swarm 服务名称和任务槽的组合。这两者都可以作为环境变量以及完整的任务名称(books-service.1.zabvo1jal0h2xya9qfftnrnej)传递给容器:

version: "3.0"
services:
  test:
    image: debian:buster
    command: cat /dev/stdout
    environment:
      SERVICE_NAME: '{{ .Service.Name }}'
      TASK_SLOT: '{{ .Task.Slot }}'
      TASK_NAME: "{{ .Task.Name }}"

通过这些后,您可以剥离 TASK_NAME 以获得所需的内容,或者将 SERVICE_NAMETASK_SLOT 结合使用。想想看,你可以直接在模板中组合它们:

version: "3.0"
services:
  test:
    image: debian:buster
    command: cat /dev/stdout
    environment:
      MY_NAME: '{{ .Service.Name }}.{{.Task.Slot}}'

可以找到其他可能的占位符here

【讨论】:

  • 正是我所需要的——尽管在文档中提到了task,但我还是不太能建立联系。很高兴在符合条件的情况下尽快为您提供赏金。干杯!
  • 另外,我希望docker ps 中的最后一列改为TASK NAMES。那会为我节省不少时间。 :)
  • @user991710 说实话,我对 TASK_SLOT 也有同样的问题。我必须通过实验来检查它是否是我认为的那样。
  • 任务和容器之间存在 1:1 绑定。 docker ps 提供容器视图,在 swarm 服务的情况下,它显示由任务创建的容器。任务名称由 NAME 列中的docker service ps ${servicename} 显示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多