在 docker 容器内的 node.js 应用程序 运行 中找到 docker 名称

find docker name in a node.js application running inside docker container

我有一个 node.js 应用程序 运行 在一个 docker 容器中,带有基本图像 node:16-alpine3.11。 我想获取 运行 所在容器的名称。

ex:
docker ps:

CONTAINER ID     NAMES
xyz               node

test.js:
const c_name= //get container name

从容器外

您可以使用 docker cli 来执行此操作。在示例中,我们过滤祖先 bitnami/redis(在您的情况下,这将是 node:16-alpine3.11

$ docker container ls --filter "ancestor=bitnami/redis" --format "table {{.ID}}\t{{.Image}}\t{{.Names}}"

此 returns 容器的 ID、名称和图像作为 table。要将结果检索为 json 对象,请更新格式标志,如下所示:

docker container ls --filter "ancestor=bitnami/redis" --format 'json { "Id":"{{.ID}}", "Image": "{{.Image}}", "Names": "{{.Names}}" }'

查看 docker 提供的便利 cli reference docs

来自容器内部

将 unix 套接字传递给容器并调用脚本获取容器名称:

$ docker run -it -v "/var/run/docker.sock:/var/run/docker.sock" origami-duckling:latest

`origami-duckling 的 Dockerfile 如下所示:

FROM node:16-alpine3.11

WORKDIR /usr/app

RUN apk add curl jq
ENV DOCKER_HOST="unix:///run/docker.sock"

COPY get-container-name.sh /usr/app/get-container-name.sh
CMD /usr/app/get-name.sh

You would probably run the get-container-name before you use cmd to run the node app in your container.

get-container-name.sh 看起来像这样:

#!/usr/bin/env sh
export CONTAINER_NAME="$(curl -s --unix-socket /run/docker.sock http://docker/containers/$HOSTNAME/json | jq '.Name')"

echo $CONTAINER_NAME

更新:如果需要,您可以在 node.js 应用中执行此操作:

I'm using got@11.8.3, got 12.x is pure ESM.

const got = require('got');
async function getHostName() {
  const metadata = await got(`http://unix:/var/run/docker.sock:/containers/${process.env.HOSTNAME}/json`).json();

  console.log('Container name', metadata.Name);
  return metadata.Name
}