从容器内部获取内省元数据

我想知道如何访问在ECS集群中运行的容器内的内省元数据 。

文档build议调用:

curl http://localhost:51678/v1/metadata 

它在EC2实例本身上工作,但不在不在同一networking中的容器上( 桥接networking模式下)。

但是,访问EC2内省元数据的命令行之有效,因为必须对该IP地址进行呼叫,该IP地址可从容器中访问:

 curl http://169.254.169.254/latest/meta-data/ 

我想一个办法是改变networking模式共享主机接口,但在目前的设置,我宁愿避免。

在上下文中,我尝试将自定义Cloudwatch指标从本地脚本发送到实用程序容器的代码。 我想避免指定像ECS集群名称这样的东西,当它可以从API调用中检索。

好吧,我find了一个方法。

ECS集群运行在EC2实例上的容器可以从其私有IP(不可靠)或从Docker Bridge IP访问主机IP,并且可以在其上运行内省调用。

Docker Bridge IP选项定义容器将在哪个networking上运行,缺省值为172.17.0.0/16 ,可以在文件/etc/sysconfig/docker (官方ECS社区AMI上 )中修改。 OPTIONS

 OPTIONS="--ip-forward=true --iptables=true --bip="172.32.0.1/24" --storage-opt dm.basesize=100G" 

因此,即使主机的docker0networking接口可能具有IP地址172.17.0.1 ,也最好通过提取docker0networking接口的网关的IP地址从容器中检索它,方法如下:

ip route|head -n 1|sed -r 's/default via ([0-9.]+).*$/\1/'


所以在我的容器中,运行这些命令将返回我所期望的:

 HOST_IP=$(ip route|head -n 1|sed -r 's/default via ([0-9.]+).*$/\1/') clusterName=$(curl -s "http://$HOST_IP:51678/v1/metadata" | jq -r ".Cluster") instanceArn=$(curl -s "http://$HOST_IP:51678/v1/metadata" | jq -r ".ContainerInstanceArn")