如何从ECS容器中获取任务ID?

cod*_*ark 5 containers docker aws-sdk aws-ecs

您好,我对Task ID从EC2主机内部运行容器中检索感兴趣。

AWS ECS文档指出存在ECS_CONTAINER_METADATA_FILE带有此数据位置的环境变量,但是只有在ECS_ENABLE_CONTAINER_METADATA创建集群/ EC2实例时将变量设置为true时,才可以设置/可用。我看不到在aws控制台中可以在哪里完成。

此外,文档指出,可以通过在主机中将其设置为true来完成此操作,但需要重新启动Docker代理。

还有其他方法可以执行此操作,而不必进入EC2内部进行设置并重新启动Docker代理吗?

Ben*_*Ben 10

我使用的技术是在容器定义中设置环境变量。

如果您通过 Cloudformation管理您的任务,相关的 yaml 如下所示:

  Taskdef:
    Type: AWS::ECS::TaskDefinition
    Properties:
      ...
      ContainerDefinitions:
        - Name: some-name
          ...
          Environment:
            - Name: AWS_DEFAULT_REGION
              Value: !Ref AWS::Region
            - Name: ECS_ENABLE_CONTAINER_METADATA
              Value: 'true'
Run Code Online (Sandbox Code Playgroud)

这种技术可以帮助您保持一切简单和可重复。

如果您以编程方式需要元数据并且无权访问元数据文件,则可以查询代理的元数据端点

curl http://localhost:51678/v1/metadata
Run Code Online (Sandbox Code Playgroud)

请注意,如果您作为正在运行的任务获取此信息,您可能无法连接到环回设备,但您可以连接到 EC2 实例自己的 IP 地址。


gre*_*pit 6

以前的答案是正确的,这是另一种方法:

从运行容器的 ec2 实例中,运行以下命令

curl http://localhost:51678/v1/tasks | python -mjson.tool |less
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在此输入图像描述


iGE*_*GEL 5

我们用所谓的用户数据来设置它,这些数据在机器启动时执行。有多种设置方法,例如: https: //docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html#user-data-console

它可能看起来像这样:

#!/bin/bash

cat <<'EOF' >> /etc/ecs/ecs.config
ECS_CLUSTER=ecs-staging
ECS_ENABLE_CONTAINER_METADATA=true
EOF
Run Code Online (Sandbox Code Playgroud)

重要提示:调整ECS_CLUSTER上述内容以匹配您的集群名称,否则实例将无法连接到该集群。


Inn*_*nty 5

这不再适用于较新的 Amazon ECS 容器版本,实际上它现在更简单并且默认启用。请参阅此文档,但这里有一个TL;DR

如果您使用的是 Amazon ECS 容器代理版本1.39.0及更高版本,则可以在docker容器内执行此操作:

curl -s "$ECS_CONTAINER_METADATA_URI_V4/task" \
  | jq -r ".TaskARN" \
  | cut -d "/" -f 3
Run Code Online (Sandbox Code Playgroud)

这是容器代理版本的列表,但如果您正在使用:latest- 您绝对没问题。