我正在尝试设置一个简单的应用程序。它是从https://budgetapp.docsapp.io/拖出来的,意味着要在公共场所工作。我的任务是以大多数自动化方式部署它,并向公众公开Java机器的指标(远程jConsole)。 最终,它应该在大约15个精确副本中站起来。
对于此任务,我选择了AWS Fargate。它设置了漂亮的应用程序,它让我回到管理端口上的度量标准(它由Dropwizard部署)。我挣扎的是监控。它应该是真实的,至少显示CPU和内存使用情况。我可以在码头上本地做,但是Fargate错过了一件至关重要的事情。为已部署的任务设置主机名。
我得到的错误:
Error: Exception thrown by the agent : java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: 578463faab0f: 578463faab0f: System error
。这是由于在/ etc / hosts文件中缺少容器' uname -n
的条目。
好像我无法设置它!这有可能以某种方式完成吗?
我正在运行我的java服务:
java -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -Djava.rmi.server.useLocalHostname=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=5000 -Dcom.sun.management.jmxremote.rmi.port=5000 -jar budgetapp.jar server config.yml
我很乐意接受任何建议!
答案 0 :(得分:1)
这是ecs代理中的已知问题。您是否尝试过这种解决方法:
echo "$(ip a | grep -A2 eth1 | grep inet | awk '{print $2}' | sed 's#/.*##g' ) $(hostname)" >> /etc/hosts
您可以在容器的入口点获取ip并修改/ etc / host。
我相信有一个ecs代理修复方式,但我在GitHub上找不到问题。
答案 1 :(得分:0)
感谢所有帮助。 最后的答案是我在互联网上阅读的内容和答案的组合。
关键是将java.rmi.server.hostname值更改为其外部IP地址,这是我在填充jConsole表单时将使用的实际地址。 (事实证明,这个值不是服务绑定的接口,而是外部监视工具用来访问它的IP地址的值。)
同样,在入口点我需要为容器的主机名添加一个外部IP,只是为了将主机名添加到/ etc / hosts
答案 2 :(得分:0)
我在ECS Fargate上遇到了同样的问题,其代码在docker和CI / CD管道中运行良好。我还没有引导脚本,因此集成Roy的解决方案需要花点功夫。
这对我有用:
ecs_bootloader.sh
shell脚本(在我的情况下为bin
):#!/bin/bash
echo "$(ip a | grep -A2 eth1 | grep inet | awk '{print $2}' | sed 's#/.*##g' ) $(hostname)" >> /etc/hosts
#My command here:
python bin/run_all.py
修改了我的ECS任务定义,将ENTRYPOINT和命令更改为:
ENTRYPOINT: bin/ecs_bootstrap.sh
COMMAND: bin/run_all.py
注意:
ecs_bootstrap.sh
脚本调用COMMAND来改善此情况。 (当前,引导脚本会忽略COMMAND。)bin
文件夹复制到了容器中,所以不必修改Dockerfile。