我们正从ECS迁移到Fargate。在ECS中,我们可以在任务定义中设置主机名,如下所示:
“hostname”:“%HOST_NAME%”
无法使用错误创建'当networkMode = awsvpc时,容器上不支持主机名' 有没有办法设置主机名?
答案 0 :(得分:2)
AWS documentation说The hostname parameter is not supported if using the awsvpc networkMode.
FARGATE不支持awsvpc以外的任何内容,因此无法使用FARGATE启动类型在任务定义中设置主机名。
答案 1 :(得分:2)
尽管文档清楚表明不支持此操作,但是有一种解决方法。您可以创建bootstrap_ecs.sh文件并覆盖容器ENTRYPOINT以在运行时引用此文件(或将以下内容添加到您自己的bootstrap脚本中)。从ECS运行时,可以使用此功能。否则,请使用标准的ENTRYPOINT和COMMAND。
bootstrap_ecs.sh
#!/bin/bash
ifconfig # prints full IP info
echo "Detecting 'eth1' interface..."
DETECTED_IP=$(ifconfig -a | grep -A2 eth1 | grep inet | awk '{print $2}' | sed 's#/.*##g' | grep "\.")
if [[ -z $DETECTED_IP ]]; then
echo "Detecting 'eth0' interface ('eth1' not found)..."
DETECTED_IP=$(ifconfig -a | grep -A2 eth0 | grep inet | awk '{print $2}' | sed 's#/.*##g' | grep "\." | head -1)
fi
DETECTED_HOSTNAME=$(hostname)
echo -e "\n\nDETECTED_IP=$DETECTED_IP\nDETECTED_HOSTNAME=$DETECTED_HOSTNAME\n\n"
# Note: newer OS versions us `ip` instead of `ifconfig`
# Echo for debugging. You can comment/delete the 1st and 3rd lines once everything is working.
echo -e "Current file contents:\n $(cat /etc/hosts)"
echo "$DETECTED_IP $DETECTED_HOSTNAME" >> /etc/hosts
echo -e "\n\n\nUpdated file contents:\n $(cat /etc/hosts)"
CMD="$@"
$CMD
答案 2 :(得分:1)
我最近遇到了同样的问题,但是我们采取的路径不同于为每个任务设置主机名。
GitHub上有一个针对datadog-agent的悬而未决的问题,该问题在ECS和Fargate上的sidecar容器中运行时适用:https://github.com/DataDog/datadog-agent/issues/3159
这导致发现DD_DOGSTATSD_TAG_CARDINALITY=orchestrator
设置,该设置在ECS和Fargate上运行时会自动添加task_arn标记。 https://docs.datadoghq.com/getting_started/tagging/assigning_tags/?tab=containerizedenvironments#environment-variables
答案 3 :(得分:0)
让我分享一个我申请设置Avro Schema Registry的技巧。回答这个问题可能会有帮助。架构注册表需要设置SCHEMA_REGISTRY_HOST_NAME
环境变量。使用AWS Fargate和awsvpc
联网模式,无法像在该线程中已经指出的那样,在任务定义中显式设置主机名属性。对于水平缩放,您需要多个注册表实例,每个实例都有自己的SCHEMA_REGISTRY_HOST_NAME
值。我已经通过以下方式在任务定义中覆盖了Command
属性(HOSTNAME
由Docker提供,并且在awsvpc
体制下,它可靠地反映了主机名):
sh,-c,export SCHEMA_REGISTRY_HOST_NAME=$HOSTNAME;/etc/confluent/docker/run
这种方法的缺点是您现在依赖于图像的实现细节。在这种情况下,来自Dockerfile的原始CMD
语句。这就是为什么始终使用带有图像名称的特定版本标签而不是依赖latest
标签的原因。
P.S。作为参考,这是我的原始comment on Issues 1126 for Schema Registry。