在 Docker Swarm 中的容器 运行 中获取完整容器名称的可靠方法
Reliable way of getting the full container name inside a container running in Docker Swarm
背景:我有一个设置,其中许多不同的可扩展服务通过连接池(每个实例)连接到它们的数据库。 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 | ...
实际上,我想做的是提供 当前 Docker Swarm 容器名称,包括缩放标识符 , 使 DBMS 能够更好地监控数据库连接,即:
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 节点上 运行ning 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 中 运行ning(例如 ),但这对我也没有帮助,因为那些也只列出容器 ID。
有没有办法从 Docker 容器中获取此值,该容器 运行 成群?
您需要的 (books-service.1
) 是群服务名称和任务槽的组合。这两个都可以作为环境变量传递给容器,以及完整的任务名称 (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_NAME
与 TASK_SLOT
结合起来。想想看,你可以直接在模板中组合它们:
version: "3.0"
services:
test:
image: debian:buster
command: cat /dev/stdout
environment:
MY_NAME: '{{ .Service.Name }}.{{.Task.Slot}}'
可以找到其他可能的占位符 here。
背景:我有一个设置,其中许多不同的可扩展服务通过连接池(每个实例)连接到它们的数据库。 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 | ...
实际上,我想做的是提供 当前 Docker Swarm 容器名称,包括缩放标识符 , 使 DBMS 能够更好地监控数据库连接,即:
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 节点上 运行ning 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 中 运行ning(例如
有没有办法从 Docker 容器中获取此值,该容器 运行 成群?
您需要的 (books-service.1
) 是群服务名称和任务槽的组合。这两个都可以作为环境变量传递给容器,以及完整的任务名称 (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_NAME
与 TASK_SLOT
结合起来。想想看,你可以直接在模板中组合它们:
version: "3.0"
services:
test:
image: debian:buster
command: cat /dev/stdout
environment:
MY_NAME: '{{ .Service.Name }}.{{.Task.Slot}}'
可以找到其他可能的占位符 here。