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", "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" }