Amazon ECS 容器元数据文件 - Amazon Elastic Container Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon ECS 容器元数据文件

从 Amazon ECS 容器代理版本 1.15.0 开始,容器或主机容器实例中提供了各种容器元数据。通过启用此功能,您可以从容器或主机容器实例中查询有关任务、容器以及容器实例的信息。元数据文件是在主机实例上创建的,并作为Docker卷装入容器中,因此在 Amazon Fargate上承载任务时不可用。

清除容器时,主机实例上的容器元数据文件将被清除。在这种情况下,您可以使用 ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION 容器代理变量进行调整。有关更多信息,请参见 自动化任务和映像清除

开启容器元数据

您可以将 ECS_ENABLE_CONTAINER_METADATA 容器代理变量设置为 true,从而在容器实例级别启用容器元数据。您可以在 /etc/ecs/ecs.config 配置文件中设置此变量,并重新启动代理。您也可以在启动代理容器时将其设置为 Docker 环境变量。有关更多信息,请参见 Amazon ECS 容器代理配置

如果在代理启动时将 ECS_ENABLE_CONTAINER_METADATA 设置为 true,则会为从那时起创建的任何容器创建元数据文件。Amazon ECS 容器代理无法为那些在 ECS_ENABLE_CONTAINER_METADATA 容器代理变量设置为 true 之前创建的容器创建元数据文件。为确保所有容器都收到元数据文件,应在容器实例启动时设置此代理变量。以下是一个示例用户数据脚本,该脚本将设置此变量以及将容器实例注册到您的集群中。

#!/bin/bash cat <<'EOF' >> /etc/ecs/ecs.config ECS_CLUSTER=your_cluster_name ECS_ENABLE_CONTAINER_METADATA=true EOF

容器元数据文件位置

默认情况下,容器元数据文件写入到以下主机和容器路径。

  • 对于 Linux 实例:

    • 主机路径:/var/lib/ecs/data/metadata/cluster_name/task_id/container_name/ecs-container-metadata.json

      注意

      Linux 主机路径假定在启动代理时使用默认数据目录挂载路径 (/var/lib/ecs/data)。如果您并非使用经 Amazon ECS 优化的 AMI(或 ecs-init 程序包来启动和维护容器代理),请确保将 ECS_HOST_DATA_DIR 代理配置变量设置为容器代理状态文件所在的主机路径。有关更多信息,请参见 Amazon ECS 容器代理配置

    • 容器路径:/opt/ecs/metadata/random_ID/ecs-container-metadata.json

  • 对于 Windows 实例:

    • 主机路径:C:\ProgramData\Amazon\ECS\data\metadata\task_id\container_name\ecs-container-metadata.json

    • 容器路径:C:\ProgramData\Amazon\ECS\metadata\random_ID\ecs-container-metadata.json

但是为了便于访问,容器元数据文件位置设置为容器内的 ECS_CONTAINER_METADATA_FILE 环境变量。您可以使用以下命令读取容器中的文件内容:

  • 对于 Linux 实例:

    cat $ECS_CONTAINER_METADATA_FILE
  • 对于 Windows 实例 (PowerShell):

    Get-Content -path $env:ECS_CONTAINER_METADATA_FILE

容器元数据文件格式

以下信息存储在容器元数据 JSON 文件中。

Cluster

容器的任务在其上运行的集群的名称。

ContainerInstanceARN

主机容器实例的完整 Amazon Resource Name (ARN)。

TaskARN

容器所属的任务的完整 Amazon Resource Name (ARN)。

TaskDefinitionFamily

容器正在使用的任务定义系列的名称。

TaskDefinitionRevision

容器正在使用的任务定义修订版本。

ContainerID

容器的 Docker 容器 ID (而不是 Amazon ECS 容器 ID)。

ContainerName

容器 Amazon ECS 任务定义中的容器名称。

DockerContainerName

Docker 守护程序用于容器的容器名称(例如,docker ps 命令输出中显示的名称)。

ImageID

用于启动容器的 Docker 映像的 SHA 摘要。

ImageName

用于启动容器的 Docker 映像的映像名称和标签。

PortMappings

与容器关联的任何端口映射。

ContainerPort

公开的容器上的端口。

HostPort

公开的主机容器实例上的端口。

BindIp

Docker 分配给容器的绑定 IP 地址。此 IP 地址仅适用于 bridge 网络模式,只能从容器实例进行访问。

Protocol

用于端口映射的网络协议。

Networks

容器的网络模式和 IP 地址。

NetworkMode

容器所属的任务的网络模式。

IPv4Addresses

与容器关联的 IP 地址。

重要

如果您的任务使用的是 awsvpc 网络模式,则将不会返回容器的 IP 地址。在这种情况下,您可以通过使用以下命令读取 /etc/hosts 文件来检索 IP 地址:

tail -1 /etc/hosts | awk '{print $1}'
MetadataFileStatus

元数据文件的状态。如果状态为 READY,则元数据文件是最新状态且内容完整。如果文件尚未准备就绪 (例如在启动任务时),将会提供文件格式的截断版本。为了避免可能出现的竞用情况,比如已经启动容器,但尚未写入元数据,您可以解析元数据文件,并等待此参数设置为 READY,然后再使用元数据。这通常是在容器启动后的 1 秒内提供。

AvailabilityZone

主机容器实例所在的可用区。

HostPrivateIPv4Address

容器所属任务的私有 IP 地址。

HostPublicIPv4Address

容器所属任务的公有 IP 地址。

例 Amazon ECS 容器元数据文件 (READY)

以下示例显示了处于 READY 状态的容器元数据文件。

{ "Cluster": "default", "ContainerInstanceARN": "arn:aws:ecs:us-west-2:012345678910:container-instance/default/1f73d099-b914-411c-a9ff-81633b7741dd", "TaskARN": "arn:aws:ecs:us-west-2:012345678910:task/default/2b88376d-aba3-4950-9ddf-bcb0f388a40c", "TaskDefinitionFamily": "console-sample-app-static", "TaskDefinitionRevision": "1", "ContainerID": "aec2557997f4eed9b280c2efd7afccdcedfda4ac399f7480cae870cfc7e163fd", "ContainerName": "simple-app", "CreatedAt": "2023-10-08T20:09:11.44527186Z", "StartedAt": "2023-10-08T20:09:11.44527186Z", "DockerContainerName": "/ecs-console-sample-app-static-1-simple-app-e4e8e495e8baa5de1a00", "ImageID": "sha256:2ae34abc2ed0a22e280d17e13f9c01aaf725688b09b7a1525d1a2750e2c0d1de", "ImageName": "httpd:2.4", "PortMappings": [ { "ContainerPort": 80, "HostPort": 80, "BindIp": "0.0.0.0", "Protocol": "tcp" } ], "Networks": [ { "NetworkMode": "bridge", "IPv4Addresses": ["192.0.2.0"] } ], "MetadataFileStatus": "READY", "AvailabilityZone": "us-east-1b", "HostPrivateIPv4Address": "192.0.2.0", "HostPublicIPv4Address": "203.0.113.0" }
例 未完成的 Amazon ECS 容器元数据文件 (尚未处于 READY 状态)

以下示例显示了尚未处于 READY 状态的容器元数据文件。文件中的信息仅限任务定义中已知的几个参数。容器元数据文件应在容器启动后的 1 秒内准备就绪。

{ "Cluster": "default", "ContainerInstanceARN": "arn:aws:ecs:us-west-2:012345678910:container-instance/default/1f73d099-b914-411c-a9ff-81633b7741dd", "TaskARN": "arn:aws:ecs:us-west-2:012345678910:task/default/d90675f8-1a98-444b-805b-3d9cabb6fcd4", "ContainerName": "metadata" }