我正在努力解决以下问题。我们有一个在 Docker 上正常运行的 Java 应用程序。现在,当我们尝试将应用程序迁移到 Docker Swarm 时 - 将其作为服务运行 - 它总是抛出以下异常:
Cache - Unable to set localhost. This prevents creation of a GUID. Cause was: 39bc5cdfb3d9: 39bc5cdfb3d9: Name or service not known
java.net.UnknownHostException: 39bc5cdfb3d9: 39bc5cdfb3d9: Name or service not known
请注意,39bc5cdfb3d9
是容器 ID。
我尝试了以下方法:
- 针对我们正在使用的 DNS
curl
- 更新其他服务器备份的
nginx
配置
设置:
- 3 经理
- 容器仅在 2 台服务器上运行 app1.dev 并且 app2.dev 它有一个约束 label=dev
- 使用默认网络入口,
DNS:dev-ecc.toroserver.com我使用以下命令运行该服务:
docker service create
${HTTP}
${HTTPS}
${VOLUMES}
${ENV_VARS}
${LICENSE}
${LOGS}
--limit-memory 768mb
--mode=global
--constraint 'engine.labels.serverType == dev'
--env appName="${SUB_DNS}"
--name="${SUB_DNS}"
--restart-condition on-failure --restart-max-attempts 5
--with-registry-auth
${DOCKER_REGISTRY}/${DOCKER_USER}/${APPNAME}:${VERSION}
另外我每次尝试登录时都会出现此错误,它会自动注销我的会话,不确定是否与错误有关无法设置本地主机
2017-11-08 03:25:56,771 [ INFO] AjaxTimeoutRedirectFilter - User session expired or not logged in yet
2017-11-08 03:25:56,771 [ INFO] AjaxTimeoutRedirectFilter - User session expired or not logged in yet
2017-11-08 03:25:56,778 [ INFO] AjaxTimeoutRedirectFilter - Redirect to login page
2017-11-08 03:25:56,778 [ INFO] AjaxTimeoutRedirectFilter - Redirect to login page
2017-11-08 03:30:36,822 [ INFO] AjaxTimeoutRedirectFilter - User session expired or not logged in yet
2017-11-08 03:30:36,822 [ INFO] AjaxTimeoutRedirectFilter - User session expired or not logged in yet
任何见解将不胜感激。谢谢。
"缓存 - 无法设置本地主机"似乎是来自 EHCache 项目的常见错误消息。在代码中找到这一点表明,这是调用 Java 网络库的 java.net.InetAddress.getLocalHost()
方法的结果,该方法查找本地主机名,然后尝试将其 DNS 解析为 IP 地址。
快速的本地测试表明,这适用于我的单节点 Swarm 上的docker run
和服务。鉴于您提到测试 DNS,也许此时需要有关您的特定 Swarm 设置(特别是网络)的更多信息,以了解您为什么会出现不同的行为。显然,如果您有自己的DNS,那么如上所述,容器的默认名称必须可以通过DNS查找解析,否则您将继续获得Java UnknownHostException
。